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

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

BME280を使って温度、湿度、気圧の測定

2018-11-08 | Arduino

BME280搭載 温湿度・気圧センサーモジュールを入手したので、Arduinoと組み合わせて測定実験を行ってみた。
配線とスケッチはスイッチサイエンスのBME280の説明掲載ページを参考にしています。
ArduinoはAmazonで購入した中国製と思われる格安の互換品をつかいました。
あまりにも安く、うまく動作するか心配でしたが、何とか動いているようです。
また、データをPCに取りこむために、Tera Termを使います。

Arduino互換品、BME280

 

配線

 

ブレッドボードで配線

BME280モジュールのシルード作製


測定データをシリアルモニタで確認

Tera Termの設定
Tera Termを起動し、新しい接続でシリアルにチェックを入れOKボタンをクリック

測定結果をTera Termで表示

エクセルでグラフ表示
Tera Termで表示されたデータをコピーし、Excelに貼り付けます。
Tera Termは1回の測定データ全てが、Excelの1セルにに貼り付けされますので、データ タブの区切り位置で
データを分解し、必要なデータのみを取り出しグラフを作成してみました。


 

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

心拍センサー(パルスセンサー)のテスト(4-2)

2014-05-14 | Arduino

パルスセンサーはArduinoのために設計された、プラグアンドプレイの心拍センサーです。
センサー本体からリード線が3本でており、赤い線が +5vへ、黒い線が GNDへ、紫の線が 信号線でArduinoのアナログ入力「A0」へ接続します。
今回は他に LED 3個をArduinoに接続し点滅で心拍を確認します。センサーは耳たぶに専用の治具で装着すると安定した信号が得られるようです。
また、センサーは回路が露出したままなので、ビニールの薄膜シール等で保護する必要があります。

配線図
   

ArduinoおよびProcessingのスケッチは、SWITCH-SCIENCE のページからダウンロードし、解凍しておきます。

Arduinoの起動
解凍したArduinoフォルダーの中から、pulseSensorAmped_Arduino_1dot_1をダブルクリックで起動します。


Arduino IDEの画面が開くので、メニューのツールから、マイコンボードの種類、シリアルポートNo.を確認した後、コードをArduinoマイコンボードに書き込みます。


Processingの起動
Arduinoを起動した後、そのままの状態でProcessingを起動します。
解凍したProcessingのフォルダー中から、PulesSensorAmped_Processing_1dot1をダブルクリックで起動します。


コードが読み込まれた状態でProcessingが起動するので、三角マークのRunボタンをクリックします。


問題がなければ、Pilse Sensor Amped Visualizer 1.1が開きセンサーからの信号が表示されます。


 

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

パルスセンサ-(心拍センサ)のテスト(4-1)

2014-05-13 | Arduino

パルスセンサーSEN-11574の出力を、Arduino(ArduinoIDE)とProcessingで視覚化するテストしてみました。
Processingはビジュアルデザイン用のプログラミング言語で、ビジュアル表現に特化したツールです。
また、Arduinoとは相性が良く、ArduinoIDEとペアで利用することが可能で、Arduinoで計測したデータをProcessingで視覚化することが可能です。

Processingのインストール
Processingの公式ページ http://processing.org/に行き、上部メニューからDownloadを選びます。
No Donation(寄付なし)チェックを入れ再度Downloadをクリックする。
自分のPCにあったバージョンを選びダウンロードを実行します。
ダウンロードしたファイルを解凍すればインストールが完了です。

最初にオライリージャパン発行の「Processingをはじめよう」を参考に、光センサのCDS出力をArduinoで計測しProcessingで視覚化してみました。

回路図
   

Arduino用スケッチ

//Arduino用
int sensorPin = 0;  //入力ピン
int val = 0;

void setup() {
  Serial.begin(9600);  //シリアルポートを開く
}

void loop() {
  val = analogRead(sensorPin) / 4;  //センサを読む
  Serial.write((byte)val);  //値を送信
  delay(100);                //100ミリ秒待つ
}


主な内容
センサはArduinoボードのアナログ入力ピン(A0)に接続
センサからの情報はanalogRead()でよみとる。
値は0~1023の範囲なので、4で割って0~255の範囲に変換しvalに代入
0~255の範囲であれば単一のbyteデータで送信ができる
Serial.writeで送信

 

Processing用スケッチ

import processing.serial.*;

Serial port; //Serialクラスのオブジェクト 
float val;  //シリアルポートから受信したデータ

void setup() {
  size(440,220);

  //重要
  //Serial.list()で取得したリストの、最初のシリアルポートがArduinoボードの
 //はずですが、実行環境によってはそうならないことがあります。
  //動作しない場合は println(Serial.list());を実行して、シリアルポートの
  //状態を確認し、次の行の[0]を、Arduinoボードが接続されているポートの
 //番号へ変更します。

  println(Serial.list());  //この行を有効にするとリストが表示される。
  String arduinoPort = Serial.list()[0];
  port = new Serial(this,arduinoPort, 9600);
}

void draw() {
  if(port.available() > 0) {  //データが届いているなら
    val = port.read();   //読み込んで、変数valに格納
    val = map(val, 0, 255,0, height); //値を変換
  }
  rect(40, val-10, 360, 20);
}

主な内容
Serialライブラリの読み込みは1行で行っている。
setup)()ないでシリアルポートが開かれ、シリアル通信が有効となる。
draw()ブロックの中で、Serialオブジェクトのread()メソッドを使って値を読み込む
新しいデータが届いたときだけ、読み込みが行われる。
map()関数を使って画面に納まるようにする

使い方
最初にArduino用コードをArduinoボードにアップロードしておきます。
次にProcessingにコードを記入し RUN すると、Arduinoボードからシリアル通信で送られてきたデータを読み取り、画面表示に適した値に変換した後描画ウインドウに表示されます。

processinngの表示画面

光センサCDSの上で手をかざし、光の加減を変化させると表示画面に変化が現れる。
受信した値の大小により横線が上下に移動する。

Arduinoからのデータ受信とprocessingによるそのデータの表示が確認できましたので、別のフォーマットで視覚化します。
光センサの出力データとそれを平均化したデータを上下に配置して表示します。
光センサからの信号は上半分に、それを平均化して滑らかになった線を下半分に表示する。

Processing用スケッチ

import processing.serial.*;

Serial port; //Serialクラスのオブジェクト
float val; //シリアルポートからの受信したデータ
int x;
float easing = 0.05;
float easedVal;

void setup() {
  size(440,440);
  frameRate(30);
  String arduinoPort = Serial.list()[0];
  port = new Serial(this, arduinoPort, 9600);
  background(0);
}

void draw() {
  if(port.available() > 0) {   //もしデータが届いていたら
    val = port.read();    //読み込んでvalへ代入
    val = map(val, 0, 255, 0, height/2); //値を変換  
  }
 
  float targetVal = val;
  easedVal += (targetVal - easedVal) * easing;
  stroke(0);
  line(x, 0, x, height);   //黒い線
  stroke(255);
  line(x+1, 0, x+1, height);   //白い線
  line(x, 220, x, val);    //生データ
 line(x, 440, x, easedVal + 220 );  //平均値
 
 x++;
 if(x > width) {
   x = 0;
 }
}

processinngの表示画面
Arduinoは前回と同じくボードにスケッチを書き込み動作状態にしておき、processingをRUNします。


引き続き心拍センサー(パルスセンサー)のテスト(4-2)で、SEN-11574の視覚化を掲載します。

コメント
  • 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でシェアする

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でシェアする

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

2014-01-25 | Arduino

クローラーの進行方向を変える
 前回までのクローラーの進行方向は前進と後退のみでしたので、進行方向を変えたり旋回したりのスケッチを追加しました。

90度方向転換
 左・右に90度方向を変えるために、AモーターとBモーターの回転方向を逆にして、回転角度が90度になるよう時間を調整しました。

イメージ(左へ方向転換)


 方向転換のサブルーチン
  //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);
  }
 }


左右に旋回する
 左右に曲がりながら走行するように、AモーターとBモーターの回転数を変えます。回転数の差が大きいほど小回りになります。
 モーター毎に回転数が変わるので引数が3個になります。

 イメージ(右へ旋回)

 
 旋回のサブルーチン
 //前進左旋回
 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);
  }
 }

 

トータルスケッチ
 直進と左90℃方向転換を4回繰り返し元の場所に戻る
 左方向に1回転旋回し元の場所に戻る

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

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

//サブルーチン

//前進設定
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);
  }
 }

 
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);
   }


void loop()
   {

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

  digitalWrite(LED,HIGH);

   delay(2000);


forward(150,5000);
delay(1000);
left(150,1000);

forward(150,5000);
delay(1000);
left(150,1000);

forward(150,5000);
delay(1000);
left(150,1000);

forward(150,5000);
delay(1000);
left(150,1000);


FLcircle(150,80,22000);
delay(1000);

stopped();

digitalWrite(LED,LOW);

 }
 

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

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

2014-01-22 | Arduino

電源スイッチ・スタートスイッチ・LEDの取り付け
 ユニバーサルプレート上にユニバーサル基板を利用して、電源スイッチとブレッドボードを取り付け。 
 さらに、ブレッドボードを使ってスタートボタンとLEDランプを取り付け配線をします。

電源スイッチ
 電源スイッチはArduinoとモーター用電源をそれぞれ単独で入り切りできるように取り付けました。

 Arduinoにプログラムをアップロードする時や、モーターを別電源で駆動する時に使います。

ブレッドボード 
 ブレッドボードは、今後回路等を仮り接続して実験や調整できるように小さいものを取り付けました。

スタートスイッチ
 現状では電源が入ると即スタートする状態なので、スケッチ上でスイッチの ON/OFF を判断してスタートできるように回路の追加とスケッチの変更を行いました。
 スイッチはブレッドボード上にタクトスイッチを取り付けて、デジタル7番ピンに接続します。

LEDランプ
 プログラム動作状態でLEDランプが点滅するように、LED回路をデジタル6番ピンに追加します。

配線



スケッチ
 各動作をサブルーチンから読み込むように大幅に変更となりました。
 スタートスイッチが押されるとLEDランプが点灯し、約2秒経過後 Fedein  forward  fadeout  backward の順に回転し  stoppedで停止します。
 最後にLEDランプを消灯してスタートスイッチの入力待ちになります。
 void Loop内のサブルーチンを入れ替えると回転方向や回転モードを変えることができます。また、forward  backward の引数の値を変えることにより回転速度と  回転時間が変わります。

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

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

//サブルーチン
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);
  }
 }


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);
 }
 }

void astop()
 {
 analogWrite(pwm_a,0);
 }

void bstop()
 {
 analogWrite(pwm_b,0);
 }
 
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);
   }


void loop()
   {

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

  digitalWrite(LED,HIGH);

   delay(2000);

forw();
fadein();
delay(1000);
forward(50,5000);
delay(1000);
fadeout();
backward(100,5000);
fadeout();
stopped();

digitalWrite(LED,LOW);

 }


 

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

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

2014-01-20 | Arduino

 モーター2個でダブルギアボックスを駆動
今回はモーター2個で、「TAMIYA」のダブルギアボックスを駆動し、同じく「TAMIYA」のトラック&ホイールセットに取り付けてクローラー(無限軌道)を作ります。

ダブルギアボックス(左右独立4速タイプ)は、左右のギアボックスが独立しておりそれぞれにモーターを取り付けます。
そのことにより左右の速度を変えたり、方向を変えることが可能となります。
速度はギアの組み合わせを変えることによりは高速から低速まで4種類あり、今回は低速側の「C」を選びました。

  速度Cタイプ ギア比 114.7 : 1
    回転トルク 809gf・cm
    回転数  115rpm

クローラーの組み立て
 組み立てには「TAMIYA]のユニバーサルプレート2枚を使用し、ダブルギアボックス・トラック&ホイールセットを取り付けました。
 2枚のユニバーサルプレートは上下に重ね、間隔はダブルギアボックスと電池ホルダー(単三4本・006P)が間に収まるようにします。

 ダブルギアボックスの回転方向は、モーターの回転方向が同じであれば逆方向になってしまいますので、どちらか一方のモーターの配線を逆接続にします


Arduino基板とArdumoto基板をクローラー上部に取り付け。

 

配線

 

スケッチ
前進、後退を交互に繰り返す。

//モーターピン設定
 int pwm_a = 3;
 int dir_a = 12;

 int pwm_b = 11;
 int dir_b = 13;

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

void loop()
   {
   //正方向回転セット
   digitalWrite(dir_a, LOW);
   digitalWrite(dir_b, LOW);
 
   //回転数(100/255 39%セット)
   analogWrite(pwm_a, 100);
   analogWrite(pwm_b, 100);
   delay(5000);
 
   //逆回転セット
   digitalWrite(dir_a, HIGH);
  digitalWrite(dir_b, HIGH);
   
 
   //回転数(100/255 39%セット)
   analogWrite(pwm_a, 100);
   analogWrite(pwm_b, 100);
   delay(5000);
 }


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

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

2014-01-18 | Arduino

Ardumotoは、Arduino用モータードライバーシールドで、モーター2個を独立して制御できモーター1個当たり2Aまで電流を流すことができるようです。
モーターによる逆起電力から保護するための回路も搭載されております。
AモーターはArduinoのデジタル12番で回転方向、デジタル3番でPWM出力を変化させることにより回転速度を制御することができます。
Bモーターはデジタル13番で回転方向、デジタル11番で回転速度を制御します。
回路図やサンプルコードはスイッチサイエンスのページで見ることができます。新しいバージョンのものも発売されているようです。

(ピンエッダ、ターミナル取り付け済み)

配線図
 
とりあえずAモーター1個だけつけて回転させてみます。


 Aモーター端子にマブチ工作用モーター(FA-130タイプ)を接続

 
 マブチ工作用モーター(FA-130)
  使用電圧範囲 1.5V~3V
  適正電圧範囲 1.5V
  適正電圧・負荷時の消費電流 500mA

 ArduinoとArdumotoの電源はお互いの影響を避けるため、別電源としたほうが良いようです。
 そのために、Ardumotoの Vin 回路のパターンをカットします。
 モーター用電源 単三電池4本 6V
 Arduino用電源  006P電池  9V

 なお、スケッチを作成したり回路のテストを行うときには、ArduinoはUSB端子からArdumototoは電池以外の電源も使用することができます。

 スケッチ
 正方向回転、逆方向回転が交互に実施される

 

 //モーターAピン設定
int pwm_a = 3;
int dir_a = 12; 

void setup()
{
  //ピンモード設定
  pinMode(pwm_a, OUTPUT);
  pinMode(dir_a, OUTPUT);
 
}

void loop()
{
  digitalWrite(dir_a, LOW);  //正方向回転セット
 
  analogWrite(pwm_a, 100);   //回転数(100/255 39%セット)  

  delay(1000); 

  digitalWrite(dir_a, HIGH);  //逆回転セット
 
  delay(1000);
 
  analogWrite(pwm_a, 100);
 
  delay(1000);
}

モーター出力端子波形図
 
 スケッチのanalogWrite(pwm_a,100);の数値を変更することにより、デジタル3番ピンの出力波形が変化しそれにより実行電圧値も変わります。
 実行電圧値が変化することによりモーターの回転数が変化します。

   analogWrite(pwm_a,50); 実効値電圧 約1V

    analogWrite(pwm_a,100);実効値電圧 約2V

     analogWrite(pwm_a,100);実効値電圧 約3.9V

 

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

明けましておめでとうございます

2014-01-01 | Arduino

昨年中は多くの方々にアクセス頂き有難うございました。
今年も今迄のことを継続しつつ、新しいことにもチャレンジして、
スクラップを増やして行きたいと思っております。
本年もどうぞよろしくお願いいたします。

                 平成25年  元旦

 

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