下手の横好きのスクラップブック!!

下手の横好きの、いろいろな記録です。
電子工作・PIC・Arduino・太陽光発電・写真などetc

乾電池の良否テスト

2014-02-28 | 電子工作・PIC

Battery Checkerの製作

新しいと思われる電池や古そうな電池がごっちゃになってしまい、良否が判別が出来なくなってしまうことがよくあります。
電池の良否はテスターで電圧を測定するだけでは判定できません。テスターの内部抵抗が高いと、ほとんど無負荷の状態で測定したことになり測定、実際の出力電圧が測定できなくなります。必ず負荷をかけたうえで電圧の測定が必要です。電池が消耗すると電池の内部抵抗が上昇し、その内部抵抗による電圧ロスで電池の出力が低下します。

電池の内部抵抗
 

そこで手持ちの部品を活用して単三電池のBattery Checkerを作製した見ました。

回路図

出力を測定する電池に「100Ω」の可変抵抗器の両端をを接続し電池の負荷とします。また可変抵抗器の摺動子はレベル調整用として使います。
乾電池からの入力電流によりトランジスタ回路が動作して「LED」を点灯させます。
新品の乾電池を接続し、可変抵抗器で「LED」が消灯から点灯に変わるポイントを探し点灯したポイントで固定します。
その後、被測定乾電池を接続し「LED」が点灯すれば良品、「LED」が点灯しなければ消耗した電池と判断します。
なお、電池の出力電流と電圧を測定する端子を設けておりますので、新品の電池接続時に記録を取り、その値と被測定電池の値を比べると実際の消耗の程度が詳しくわかります。

1.5V以外の乾電池も測定可能と思われますが、まだ実測はしておりません。新品の電池を使用し、可変抵抗器でそれぞれの「LED」点灯ポイントを探してテストすれば「OK」です。

新品単三電池の測定電圧と電流
  電池1→電圧:1.6V  電流:14.99mA
  電池2→電圧:1.6V  電流:14.90mA

写真

製作
 回路本体はユニバーサル基板に配線し、各端子や可変抵抗器・LED等とともに百均で購入したプラケース組み込みました。

 

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

ArduinoUNOでブートローダーを書き込む

2014-02-21 | Arduino

 Arduinoを使用し、何かを作り恒久的に使用する場合は、組み込み用の自作のArduinoを用意すると、コスト的に有利ですし消費電力も軽減できます。
組み込み用の自作のArduinoを作る場合、AVRマイコンにブートローダーを書き込むことが必要となります。ブートローダー書き込み済みのAVRマイコンも販売されておりますが、今回は手持ちのArduinoUNOを使って,ブートローダーの書き込みができるようですのでチャレンジしてみました。
ArduinoUNOを使ったブートローダーの書き込みは、WEB上に多くの記事が書かれておりますので、それらを参考にしました。

準備するもの
 ArduinoUNO 本体
 AVRマイコンチップ ATmega328P-PU
  ブレッドボードとジャンピングリード線
 ArduinoIDEがインストールされているパソコン
 ブートローダーを書き込むソフト(今回は optifix.Zipフォルダーをダウンロードして使用:ダウンロード先はこちら
   optifix.Zipを解凍し、ArduinoIDEのフォルダにコピーする。optifixフォルダには optifix.pde と optiLoader.h が表示されます。
  optiLoader.hファイルをメモ帳で開き1行目の #include<WProgram.h> を #include<Arduino.h>に変更し保存する。

  
Arduino本体とブレッドボードを利用した配線
 ほとんどの場合セラロック(16MHz)は使われていませんが、セラロックがないとブートローダーが既に書き込み済みのマイコンチップを装着した時に、書き込み失敗と同じ表示になりますので、区別するためにセラロックを付けることにしました。



 

ブートローダー書き込み手順
 配線したブレッドボードとArduinoUNO本体とPCを接続する

ArduinoIDEを起動

 
Arduino UNOの設定
  ツール→マイコンボード→Arduino UNO
  ツール→シリアルポート→それぞれのシリアルポートを設定
 
optifixフォルダ内の、optifix.pdeを読み込みコンパイルする


ArduinoUNO 本体にアップロードする

シリアルポートをクリックしボーレートを19200bpsに設定
   この設定がされていないと文字化けして表示される。

ブートローダーが失敗した時の表示

  
ブートローダーが成功した時の表示

 ブートローダーが書き込まれたATmega328P-PUのテスト

  ATmega328P-PUをArduinoUNO本体に差し込み、01.Bacic→ Blinkのスケッチをアップロードしてテストする。
  13ピンのLEDがチカチカすればOK。
 

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

我が家の太陽光発電 2014年1月の発電量

2014-02-07 | 太陽光発電

1月の日射量は北日本の太平洋側では平年以上でしたが、内陸の盛岡では109.6h、平年比94%となりました。
この時期の発電量は、日射量のほかに積雪量が大きく影響します。積雪は少なめでしたが発電量は前年比95%でした。

 

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Arduino用モータードライブシールド「Arudumoto」でモーターを回す(5)

2014-02-03 | Arduino

フロントセンサーを取り付け、障害物を検知したら左に避ける

前回までのクローラーは前進・後退、右回り・左曲り、右旋回・左旋回のみで、万が一障害物があった場合には避けることができませんでした。
そこで、クローラーの前部に距離計を付けて障害物を検知し、検知された時には左に曲がることで障害物を避けてみました。

             


使用した距離計はシャープ製の「GP2Y0A21YK0F」で、灯光部から赤外線を投射して測定対象物から跳ね返ってくる赤外線の角度を測定し、電圧に換算し出力するものです。
そのため、対象物の反射率の影響は少なくなります。

距離計出力グラフ


距離と電圧出力はグラフのようになり、非直線の特性を持っており、何らかの換算が必要となりますが、すでに換算式が発表されておりますのでそれを利用することとします。

換算式 R=(6787/(V-3))/3

距離 5cm 以下で急激に出力電圧低下しているので、使用範囲は10cm~80cmになります。


配線図

距離計の出力をアナログ0ピンに接続し、障害物までの距離が20cm以下になったらクローラーを停止した後、左に方向を変えて再度前進を始めます。
さらに、障害物を検知した時にLEDランプが点灯するようにしております。

クローラー

距離測定ルーチン
 今回のスケッチは「Arduinoで電子工作をはじめよう!」第2版を参考にさせて頂きました。

//フロントセンサー
int front()
 {
  int tmp, distance;

  tmp = analogRead(FRONT_SEN);
  if(tmp < 4 ) tmp=4;
  distance = (6787 / (tmp-3))-4;
  return(distance);
 }


トータルスケッチ

 

//モーターピン設定
 int pwm_a = 3;
 int dir_a = 12;
 int pwm_b = 11;
 int dir_b = 13;

//スタートスイッチ LEDピン設定
 int ST_SWITCH = 7;
 int LED = 6;
 int SEN_LED =5;

//フロントセンサー設定
 int FRONT_SEN = 0;

//サブルーチン

//前進設定
void forw()
 {
 digitalWrite(dir_a,HIGH);
 digitalWrite(dir_b,HIGH);
 }

//後退設定
void back()
 {
 digitalWrite(dir_a,LOW);
 digitalWrite(dir_b,LOW);
 } 

//前進
void forward(int mspeed,int mtime)
 {
 digitalWrite(dir_a,HIGH);
 digitalWrite(dir_b,HIGH);
 analogWrite(pwm_a,mspeed);
 analogWrite(pwm_b,mspeed);
 if(mtime > 0){
  delay(mtime);
  analogWrite(pwm_a,0);
  analogWrite(pwm_b,0);
  }
 }

//後退
void backward(int mspeed,int mtime)
 {
 digitalWrite(dir_a,LOW);
 digitalWrite(dir_b,LOW);
 analogWrite(pwm_a,mspeed);
 analogWrite(pwm_b,mspeed);
 if(mtime > 0){
  delay(mtime);
  analogWrite(pwm_a,0);
  analogWrite(pwm_b,0);
  }
 }
//90度左曲り
void left(int mspeed,int mtime)
 {
 digitalWrite(dir_b,LOW);
 digitalWrite(dir_a,HIGH);
 analogWrite(pwm_b,mspeed);
 analogWrite(pwm_a,mspeed);
 if(mtime>0){
  delay(mtime);
  analogWrite(pwm_b,0);
  analogWrite(pwm_a,0);
  }
 }
//90度右曲り
void right(int mspeed,int mtime)
 {
 digitalWrite(dir_b,HIGH);
 digitalWrite(dir_a,LOW);
 analogWrite(pwm_b,mspeed);
 analogWrite(pwm_a,mspeed);
 if(mtime>0){
  delay(mtime);
  analogWrite(pwm_b,0);
  analogWrite(pwm_a,0);
  }
 }

//前進左旋回
void FLcircle(int amspeed,int bmspeed,int mtime)
 {
 digitalWrite(dir_a,HIGH);
 digitalWrite(dir_b,HIGH);
 analogWrite(pwm_a,amspeed);
 analogWrite(pwm_b,bmspeed);
 if(mtime > 0){
  delay(mtime);
  analogWrite(pwm_a,0);
  analogWrite(pwm_b,0);
  }
 }

//前進右旋回
void FRcircle(int amspeed,int bmspeed,int mtime)
 {
 digitalWrite(dir_a,HIGH);
 digitalWrite(dir_b,HIGH);
 analogWrite(pwm_a,amspeed);
 analogWrite(pwm_b,bmspeed);
 if(mtime > 0){
  delay(mtime);
  analogWrite(pwm_a,0);
  analogWrite(pwm_b,0);
  }
 }

//停止
void stopped()
 {
 digitalWrite(dir_a,LOW);
 digitalWrite(dir_b,LOW);
 analogWrite(pwm_a,0);
 analogWrite(pwm_b,0);
 }

//緩やかにスタート
void fadein()
 {
  for(int i=0;i<=200;i+=1){
  analogWrite(pwm_a,i);
  analogWrite(pwm_b,i);
  delay(30);
  }
 }

//緩やかに停止
void fadeout()
 {
  for(int i=200;i>=0;i-=1){
  analogWrite(pwm_a,i);
  analogWrite(pwm_b,i);
  delay(30);
  }
 }

//フロントセンサー
int front()
 {
  int tmp, distance;

  tmp = analogRead(FRONT_SEN);
  if(tmp < 4 ) tmp=4;
  distance = (6787 / (tmp-3))-4;
  return(distance);
 }

 
void setup()
  {
  //ピンモード設定
   pinMode(pwm_a, OUTPUT);
    pinMode(dir_a, OUTPUT);
 
   pinMode(pwm_b, OUTPUT);
    pinMode(dir_b, OUTPUT); 
 
  pinMode(ST_SWITCH,INPUT);
  pinMode(LED,OUTPUT);
  pinMode(SEN_LED,OUTPUT);
   }


void loop()
   {

   while(1){
 if(digitalRead(ST_SWITCH)==LOW)break;
 }

  digitalWrite(LED,HIGH);

   delay(2000);

while(1){
 

 forward(100,0);

 if( front() < 20){
  digitalWrite(SEN_LED,HIGH);
  
  stopped();
  delay(500);

  backward(100,1000);
  left(100,1000);

  digitalWrite(SEN_LED,LOW);
  }
 }


stopped();
delay(500);
digitalWrite(LED,LOW);

 }

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする