ステッピングモーター制御(L6470 + バイポーラ・ステッピングモータ2相) パーツ:@ARDUINO(UNO)、AL6470(株式会社ストロベリー・リナックス オリジナル)、B12V駆動の汎用バイポーラ・ステッピングモータ MERCURY MOTOR SM−42BYG011−25(株式会社ストロベリー・リナックス) プログラム・サンプル LOOPから角度・回転方向のモジュールを呼び出すことで、角度動作⇒停止を実施する。 (AUDUINOのデジタルピンは11,12,13,10を使用する) 角度・回転方向は、次を繰り返す。 720°CCW(カウンタークロックワイズ=反時計方向)⇒720°CW(クロックワイズ=時計方向) ⇒ 480°CCW ⇒ 480°CW ⇒ 360°CCW ⇒ 360°CW ⇒ 180°CCW ⇒ 180°CW ⇒ 90°CCW ⇒ 90°CW ⇒ 45°CCW ⇒ 45°CW 今回のL6470(ドライバー)でユニポーラ ステッピングモーターも回転はするが、 トルクが小さく、実用的では無いと思われる。 ![]() L6470ボード 3 SPIクロック入力⇒ ARDUINO 12 5 SPIデータアウト(出力) ⇒ ARDUINO 13 6 SPIデータIN(入力) ⇒ ARDUINO 11 7 SPIチップセレクト ⇒ ARDUINO 10 配線図 #include <Arduino.h> #include <SPI.h> // ピン定義。 #define PIN_SPI_MOSI 11 #define PIN_SPI_MISO 12 #define PIN_SPI_SCK 13 #define PIN_SPI_SS 10 void setup() { // AUDUINOデジタルピンのインアウトセット pinMode(PIN_SPI_MOSI, OUTPUT); pinMode(PIN_SPI_MISO, INPUT); pinMode(PIN_SPI_SCK, OUTPUT); pinMode(PIN_SPI_SS, OUTPUT); digitalWrite(PIN_SPI_SS, HIGH); //SPI通信 SPI.begin(); // シリアル通信 Serial.begin(9600); SPI.setDataMode(SPI_MODE3);//SCKの立上りでテータを送受信、アイドル時はpinをHIGHに設定 SPI.setBitOrder(MSBFIRST);//MSBから送信 //前コマンドをCLS L6470_send(0x00); L6470_send(0x00); L6470_send(0x00); L6470_send(0x00); //デバイスリセットコマンド L6470_send(0xc0);//ResetRevice L6470_setup();//L6470を設定 } //メインループ ルーチンを呼び出しLOOPするエリア int i = 0; void loop(){ //以下に動きを書く(サブルーチン呼び出し) while(i < 5){ //5回繰り返す L6470_720degccw(); delay(500);//一回ごとに角度を目視 L6470_720degcw(); delay(500);//一回ごとに角度を目視 L6470_480degccw(); delay(500);//一回ごとに角度を目視 L6470_480degcw(); delay(500);//一回ごとに角度を目視 L6470_360degccw(); delay(500);//一回ごとに角度を目視 L6470_360degcw(); delay(500);//一回ごとに角度を目視 L6470_180degccw(); delay(500);//一回ごとに角度を目視 L6470_180degcw(); delay(500);//一回ごとに角度を目視 L6470_90degccw(); delay(500);//一回ごとに角度を目視 L6470_90degcw(); delay(500);//一回ごとに角度を目視 L6470_45degccw(); delay(500);//一回ごとに角度を目視 L6470_45degcw(); delay(500);//一回ごとに角度を目視 i++; } } //以下は、サブルーチンエリア void L6470_720degccw(){ L6470_send(0x50);//Run(DIR,SPD),0x51:正転,0x50:逆転 L6470_send(0x00);//SPD値(20bit)いじらない L6470_send(0x20);//ここの数字を下げると遅くなる L6470_send(0x00);//いじらない delay(3177);//この数字の時間だけ動作する 約1604で1回転 L6470_send(0xB8);//HradStop_急停止 } void L6470_720degcw(){ L6470_send(0x51);//Run(DIR,SPD),0x51:正転,0x50:逆転 L6470_send(0x00);//SPD値(20bit)いじらない L6470_send(0x20);//ここの数字を下げると遅くなる L6470_send(0x00);//いじらない delay(3177);//この数字の時間だけ動作する 約1604で1回転 L6470_send(0xB8);//HradStop_急停止 } void L6470_480degccw(){ L6470_send(0x50);//Run(DIR,SPD),0x51:正転,0x50:逆転 L6470_send(0x00);//SPD値(20bit)いじらない L6470_send(0x20);//ここの数字を下げると遅くなる L6470_send(0x00);//いじらない delay(2390);//この数字の時間だけ動作する 約1604で1回転 L6470_send(0xB8);//HradStop_急停止 } void L6470_480degcw(){ L6470_send(0x51);//Run(DIR,SPD),0x51:正転,0x50:逆転 L6470_send(0x00);//SPD値(20bit)いじらない L6470_send(0x20);//ここの数字を下げると遅くなる L6470_send(0x00);//いじらない delay(2390);//この数字の時間だけ動作する 約1604で1回転 L6470_send(0xB8);//HradStop_急停止 } void L6470_360degccw(){ L6470_send(0x50);//Run(DIR,SPD),0x51:正転,0x50:逆転 L6470_send(0x00);//SPD値(20bit)いじらない L6470_send(0x20);//ここの数字を下げると遅くなる L6470_send(0x00);//いじらない delay(1604);//この数字の時間だけ動作する 約1604で1回転 L6470_send(0xB8);//HradStop_急停止 } void L6470_360degcw(){ L6470_send(0x51);//Run(DIR,SPD),0x51:正転,0x50:逆転 L6470_send(0x00);//SPD値(20bit)いじらない L6470_send(0x20);//ここの数字を下げると遅くなる L6470_send(0x00);//いじらない delay(1604);//この数字の時間だけ動作する 約1604で1回転 L6470_send(0xB8);//HradStop_急停止 } void L6470_180degccw(){ L6470_send(0x50);//Run(DIR,SPD),0x51:正転,0x50:逆転 L6470_send(0x00);//SPD値(20bit)いじらない L6470_send(0x20);//ここの数字を下げると遅くなる L6470_send(0x00);//いじらない delay(820);//この数字の時間だけ動作する 約1604で1回転 L6470_send(0xB8);//HradStop_急停止 } void L6470_180degcw(){ L6470_send(0x51);//Run(DIR,SPD),0x51:正転,0x50:逆転 L6470_send(0x00);//SPD値(20bit)いじらない L6470_send(0x20);//ここの数字を下げると遅くなる L6470_send(0x00);//いじらない delay(820);//この数字の時間だけ動作する 約1604で1回転 L6470_send(0xB8);//HradStop_急停止 } void L6470_90degccw(){ L6470_send(0x50);//Run(DIR,SPD),0x51:正転,0x50:逆転 L6470_send(0x00);//SPD値(20bit)いじらない L6470_send(0x20);//ここの数字を下げると遅くなる L6470_send(0x00);//いじらない delay(420);//この数字の時間だけ動作する 約1604で1回転 L6470_send(0xB8);//HradStop_急停止 } void L6470_90degcw(){ L6470_send(0x51);//Run(DIR,SPD),0x51:正転,0x50:逆転 L6470_send(0x00);//SPD値(20bit)いじらない L6470_send(0x20);//ここの数字を下げると遅くなる L6470_send(0x00);//いじらない delay(420);//この数字の時間だけ動作する 約1604で1回転 L6470_send(0xB8);//HradStop_急停止 } void L6470_45degccw(){ L6470_send(0x50);//Run(DIR,SPD),0x51:正転,0x50:逆転 L6470_send(0x00);//SPD値(20bit)いじらない L6470_send(0x20);//ここの数字を下げると遅くなる L6470_send(0x00);//いじらない delay(225);//この数字の時間だけ動作する 約1604で1回転 L6470_send(0xB8);//HradStop_急停止 } void L6470_45degcw(){ L6470_send(0x51);//Run(DIR,SPD),0x51:正転,0x50:逆転 L6470_send(0x00);//SPD値(20bit)いじらない L6470_send(0x20);//ここの数字を下げると遅くなる L6470_send(0x00);//いじらない delay(225);//この数字の時間だけ動作する 約1604で1回転 L6470_send(0xB8);//HradStop_急停止 } void L6470_send(unsigned char add_or_val){ digitalWrite(PIN_SPI_SS, LOW); SPI.transfer(add_or_val); // アドレスもしくはデータ送信。 digitalWrite(PIN_SPI_SS, HIGH); } void L6470_setup(){ //最大回転スピード このあとにスピードデータを送信してもこの値がりみっととなる。 L6470_send(0x07);//レジスタアドレス L6470_send(0x20);//値(10bit),デフォルト0x41 //L6470_send(0x30); //モータ停止中の電圧設定 L6470_send(0x09);//レジスタアドレス L6470_send(0xFF);//値(8bit),デフォルト0x29 //モータ定速回転時の電圧設定 L6470_send(0x0a);//レジスタアドレス L6470_send(0xFF);//値(8bit),デフォルト0x29 //加速中の電圧設定 L6470_send(0x0b);//レジスタアドレス L6470_send(0xFF);//値(8bit),デフォルト0x29 //減速中の電圧設定 L6470_send(0x0c);//レジスタアドレス L6470_send(0xFF);//値(8bit),デフォルト0x29 //フ ル ス テ ッ プ,ハ ー フ ス テ ッ プ,1/4, 1/8,…,1/128 ステップの設定 L6470_send(0x16);//レジスタアドレス L6470_send(0x00);//値(8bit) } |
ステッピングモーター制御(L6470 + バイポーラ・ステッピングモータ2相) パーツ:@ARDUINO(UNO)、AL6470(秋月電子通商)、B12V駆動の汎用バイポーラ・ステッピングモータ MERCURY MOTOR SM−42BYG011−25 1.8°(秋月電子通商) プログラム・サンプル LOOPから角度・回転方向のモジュールを呼び出すことで、角度動作⇒停止を実施する。 (AUDUINOのデジタルピンは11,12,13,10を使用するがストロベリーリナックスとピンのつなぎが違うので注意) 角度・回転方向は、次を繰り返す。 720°CW(クロックワイズ=時計方向) ![]() L6470ボード(AE−L6470DRV) 5 SPIデータアウト(出力) ⇒ ARDUINO 12 6 SPIクロック入力 ⇒ ARDUINO 13 7 SPIデータIN(入力) ⇒ ARDUINO 11 8 SPIチップセレクト ⇒ ARDUINO 10 #include <Arduino.h> #include <SPI.h> // ピン定義。 #define PIN_SPI_MOSI 11//8 //L6470SPIデータ入力 STR11 #define PIN_SPI_MISO 12//9 //L6470SPIデータ出力 STR12 #define PIN_SPI_SCK 13//10 //L6470SPIクロック入力 STR13 #define PIN_SPI_SS 10//7 //L6470SPIチップセレクト STR10 void setup() { // AUDUINOデジタルピンのインアウトセット pinMode(PIN_SPI_MOSI, OUTPUT); pinMode(PIN_SPI_MISO, INPUT); pinMode(PIN_SPI_SCK, OUTPUT); pinMode(PIN_SPI_SS, OUTPUT); digitalWrite(PIN_SPI_SS, HIGH); //SPI通信 SPI.begin(); // シリアル通信 Serial.begin(9600); SPI.setDataMode(SPI_MODE3);//SCKの立上りでテータを送受信、アイドル時はpinをHIGHに設定 SPI.setBitOrder(MSBFIRST);//MSBから送信 //前コマンドをCLS L6470_send(0x00); L6470_send(0x00); L6470_send(0x00); L6470_send(0x00); //デバイスリセットコマンド L6470_send(0xc0);//ResetRevice L6470_setup();//L6470を設定 } //メインループ ルーチンを呼び出しLOOPするエリア int i = 0; void loop(){ //以下に動きを書くとその通りに動く while(i < 50000){//連続運転 全部で61枚を回転させると、一周+1になる L6470_720degccw(); delay(500);//一回ごとに角度を目視 // L6470_720degcw(); // delay(500);//一回ごとに角度を目視 i++; } } //以下は、サブルーチンエリア void L6470_720degccw(){ L6470_send(0x50);//Run(DIR,SPD),0x51:正転,0x50:逆転 L6470_send(0x00);//SPD値(20bit)いじらない L6470_send(0x41);//ここの数字を下げると遅くなる L6470_send(0x00);//いじらない delay(1635);//この数字の時間だけ動作する 約1635で2回転 L6470_send(0xB8);//HradStop_急停止 } void L6470_720degcw(){ L6470_send(0x51);//Run(DIR,SPD),0x51:正転,0x50:逆転 L6470_send(0x00);//SPD値(20bit)いじらない L6470_send(0x41);//ここの数字を下げると遅くなる L6470_send(0x00);//いじらない delay(1635);//この数字の時間だけ動作する 約1635で2回転 L6470_send(0xB8);//HradStop_急停止 } void L6470_send(unsigned char add_or_val){ digitalWrite(PIN_SPI_SS, LOW); SPI.transfer(add_or_val); // アドレスもしくはデータ送信。 digitalWrite(PIN_SPI_SS, HIGH); } void L6470_setup(){ //最大回転スピード このあとにスピードデータを送信してもこの値がりみっととなる。 L6470_send(0x07);//レジスタアドレス L6470_send(0x41);//値(10bit),デフォルト0x41 //L6470_send(0x30); //モータ停止中の電圧設定 L6470_send(0x09);//レジスタアドレス L6470_send(0xFF);//値(8bit),デフォルト0x29 //モータ定速回転時の電圧設定 L6470_send(0x0a);//レジスタアドレス L6470_send(0xFF);//値(8bit),デフォルト0x29 //加速中の電圧設定 L6470_send(0x0b);//レジスタアドレス L6470_send(0xFF);//値(8bit),デフォルト0x29 //減速中の電圧設定 L6470_send(0x0c);//レジスタアドレス L6470_send(0xFF);//値(8bit),デフォルト0x29 //フ ル ス テ ッ プ,ハ ー フ ス テ ッ プ,1/4, 1/8,…,1/128 ステップの設定 L6470_send(0x16);//レジスタアドレス L6470_send(0x00);//値(8bit) } |
サーボモーター制御(TowerPro MicroServo 9g SC90) パーツ:@ARDUINO(UNO)、ASG90 (株)秋月電子通商 プログラム・サンプル LOOPに角度を書き込むことで、指定角度への動作を実施する。 (AUDUINOのデジタルピンは9を使用する) 角度・回転方向は、次を繰り返す。 0° ⇒ 90° ⇒ 180° ![]() 配線図 //サーボモータ SC90プログラム #include <Servo.h> Servo myservo; void setup() { myservo.attach(2); } void loop() { myservo.write(0); // set servo to 0deg-point delay(800); myservo.write(90); // set servo to 90deg-point delay(800); myservo.write(180); // set servo to 180deg-point delay(800); } |
ステッピングモーター制御(ULN2003 + 28BYJ-48ステッピングモーター) パーツ:@ARDUINO(UNO)、AULN2003+28BYJ-48(オークション購入) プログラム・サンプル (AUDUINOのデジタルピンは8、9、10、11を使用する) ![]() //このサンプルコードは28BYJ-48の時計回り・逆回りを行うデモです。 // ULN2003 インターフェースボードを使用。 // 28BYJ-48モーターは4相、8ビートモーター。 // 減速ギア比68倍。 1バイポーラ巻線。ステップ角は5.625/64。 // 動作周波数100PPS。電流92mA。 // 4tronix Arduino http://www.4tronix.co.uk/arduino/Stepper-Motors.php int motorPin1 = 8; // Blue - 28BYJ48 pin 1 int motorPin2 = 9; // Pink - 28BYJ48 pin 2 int motorPin3 = 10; // Yellow - 28BYJ48 pin 3 int motorPin4 = 11; // Orange - 28BYJ48 pin 4 // Red - 28BYJ48 pin 5 (VCC) int motorSpeed = 2300; //速度。数値が小さいほど速くなる。2000以下は脱調が起きる int count = 0; // count of steps made int countsperrev = 512; // number of steps per full revolution //int lookup[8] = {B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001}; int lookup[4] = {B01000, B00100, B00010, B00001}; //1-1相 void setup() { //declare the motor pins as outputs pinMode(motorPin1, OUTPUT); pinMode(motorPin2, OUTPUT); pinMode(motorPin3, OUTPUT); pinMode(motorPin4, OUTPUT); Serial.begin(9600); } void loop(){ if(count < countsperrev ) clockwise(); else if (count == countsperrev * 2) count = 0; else anticlockwise(); count++; } void anticlockwise() //反時計回り { for(int i = 0; i < 4; i++) { setOutput(i); delayMicroseconds(motorSpeed); } } void clockwise() //時計回り { for(int i = 3; i >= 0; i--) { setOutput(i); delayMicroseconds(motorSpeed); } } void setOutput(int out) { digitalWrite(motorPin1, bitRead(lookup[out], 0)); digitalWrite(motorPin2, bitRead(lookup[out], 1)); digitalWrite(motorPin3, bitRead(lookup[out], 2)); digitalWrite(motorPin4, bitRead(lookup[out], 3)); } |
16文字*2行 超ハイコントラスト大文字LCDモジュール パーツ:@ARDUINO(UNO)、ASC1602BS*B(バックライト無)(株)秋月電子通商 プログラム・サンプル (AUDUINOのデジタルピンは2、3、4、5、11、12を使用する) ![]() #include <LiquidCrystal.h> // LiquidCrystal display with: // rs on pin 12 // rw on pin 11 // d0, d1, d2, d3 on pins 5, 4, 3, 2 LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { // set up the LCD's number of rows and columns: lcd.begin(16,2);//LCD表示行数と桁数(16文字*2行) } void loop() { // clear LCD lcd.clear(); // Print a message to the LCD. //lcd.print("hello world"); delay(1000); lcd.setCursor(0,0);//0文字目0行にカーソルセット lcd.print("012345"); delay(1000); lcd.setCursor(6,0);//6文字目1行(下)にカーソルセット lcd.print("6789ABCDEF0"); delay(1000); lcd.setCursor(0,1);//0文字目1行(下)にカーソルセット lcd.print("fedcba987"); delay(1000); lcd.setCursor(9,1);//9文字目1行(下)にカーソルセット lcd.print("6543210"); delay(1000); } |
GPSデータをLCDに表示する。 パーツ: @ARDUINO(UNO)、ASC1602BS*B(バックライト無)(株)秋月電子通商、BGPSモジュール GT−720F(株)秋月電子通商 プログラム・サンプル (AUDUINOのSC1602BS*B用デジタルピンは2、3、4、5、11、12を使用する) (AUDUINOのGT−720F用デジタルピンは0を使用する) 今回の表示は、緯度・経度・移動速度(km/h)・移動方向(0〜355.9°) GT−720Fが急に移動方位を捕捉できなくなったが、すでに初期不良期間(14日)を 過ぎたので、交換はできなかった。後継機?としてGMS6−SR6が販売されていたので 購入したが、捕捉できないものだったため、すぐに交換してもらった。 GPSモジュールは初期不良が多いようなので、14日以内に充分なチェックを要する。 またGMS6−SR6は、電源を供給しても、LED(赤)が点灯しない。捕捉し始めてから 点灯するので、故障と間違えないようにする必要がある。 ![]() //*GPS読み込み、LCD表示 //include library code #include <LiquidCrystal.h> //LCDピンの指定 LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { //LCDセット lcd.begin(16, 2); //シリアル送受信セット Serial.begin(9600); lcd.clear();//LCDクリア } void loop() { char str[90];//GPS信号データエリア char *utctime,*latitude,*longtude,*posfix,*spdknot,*cours; double coursdbl,spdkmh; if (Serial.available()) { //もしもシリアル受信があれば下記を実行 recvStr(str); //$GPRMCの受信 if(strcmp(strtok(str,","),"$GPRMC")==0){ //$GPRMCのデータであるなら utctime=strtok(NULL,",");//その位置のUTC時間:UTC time in hhmmss.ss format, 000000.00 ~ 235959.99 //utctimeのchar文字列をダブル型に変えて数字とするエリア。例:utctime="123456.78"; // utcdouble = atof(utctime);//UTCtimeをutcdoubleにatof関数で浮動小数点型(double型)に変換 // utcdouble = utcdouble + 90000;//+90000して日本時間に変更 strtok(NULL,",");//'V’ = navigation receiver warning, ‘A’ = valid position latitude=strtok(NULL,",");//緯度 strtok(NULL,",");// N longtude=strtok(NULL,",");//経度 strtok(NULL,",");// E spdknot=strtok(NULL,",");//Speed over ground, 000.0 ~ 999.9 knots spdkmh = atof(spdknot);//spdknotをspdkmhにatof関数で浮動小数点型(double型)に変換 spdkmh=spdkmh*1.852; cours=strtok(NULL,",");//Course over ground, 000.0 ~ 359.9 degrees coursdbl = atof(cours);//coursをcoursdblにatof関数で浮動小数点型(double型)に変換 lcd.setCursor(0,0); lcd.print(latitude);//緯度(度.分)10進法 表示) 例35°**.6310’ lcd.setCursor(0,1); lcd.print(longtude);//経度(度.分)10進法 表示) 例139°**.9623' lcd.setCursor(11,0); lcd.print(spdkmh);//km/h lcd.setCursor(11,1); lcd.print(coursdbl);//動いてい方向 //データをif文で変更したいときのパターン //if(stats="V"){ // stats="STRNO"; //} //else if(stats="A"){ // stats="STROK"; //} } } } //GPSデータの読み込み buf(i)に1個ずつデータを入れる void recvStr(char *buf) { int i = 0; char c; while (1) { if (Serial.available()) { c = Serial.read(); buf[i] = c; if (c == '\n') break;//\nマークになったらデータ読み込み終了 i++; } } buf[i] = '\0';// 最後に\0を書き込みしておく。 } //$GPRMCを使用したいときは下記のパターンから読み込み可能 //$GPRMC,104549.04,A,2447.2038,N,12100.4990,E,016.0,221.0,250304,003.3,W,A*22<CR><LF> //104549.04:UTC time in hhmmss.ss format, 000000.00 ~ 235959.99 //A:Status, ‘V’ = navigation receiver warning, ‘A’ = valid position //2447.2038:Latitude in ddmm.mmmm format :Leading zeros transmitted //N:Latitude hemisphere indicator, ‘N’ = North, ‘S’ = South //12100.4990:Longitude in dddmm.mmmm format:Leading zeros transmitted //E:Longitude hemisphere indicator, 'E' = East, 'W' = West //016:Speed over ground, 000.0 ~ 999.9 knots //221.0:Course over ground, 000.0 ~ 359.9 degrees //003.3:Magnetic variation, 000.0 ~ 180.0 degrees |
コンパスモジュール(HMC6352)の方位をLCDに表示 パーツ: @ARDUINO(UNO)、ASC1602BS*B(バックライト無)(株)秋月電子通商、 Bコンパスモジュール(HMC6352)(株)ストロベリー・リナックス プログラム・サンプル (AUDUINOのSC1602BS*B用デジタルピンは0、2、3、4、5、11、12を使用する) (AUDUINOのHMC6352用アナログピンは4(SDA)、5(SCL)を使用する) 今回の表示は、方位(0〜359°) コンパスモジュールを使ってみて、自宅内だと問題ないが、車内だと、 変な方位を示す。車から約1.5m離すと、問題が無くなる。 磁力に影響しない部分から2m位は、離す必要がある。 ボートで使用可能にするため、AURDINOとコンパスをコードで離して 設置できるようにした。ただしアナログのためか、コード長で1.45m以下 にしないとうまくいかないことが判明(徐々に短くしていった結果)。 ![]() //建築発明工作ゼミ2008を参考にさせていただきました(感謝いたします) #include <Wire.h> #include <LiquidCrystal.h>//LCD Library LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // LiquidCrystal display with: //デジタルコンパスモジュールのアドレス設定 int compassAddress = 0x42 >> 1; //=0x21 //読み込み値(角度)の変数を用意 int reading = 0; void setup() { //I2C通信開始 Wire.begin(); //角度表示のためのシリアル通信開始 Serial.begin(9600);// Initialize lcd.begin(16,2);//LCD表示行数と桁数(16文字*2行) //Continuous Modeに設定する Wire.beginTransmission(compassAddress); //RAM書き込み用コマンド Wire.write('G'); //書き込み先指定 Wire.write(0x74); //モード設定 Wire.write(0x72); //通信終了 Wire.endTransmission(); //処理時間 delayMicroseconds(70); } void loop() { //デバイスに2バイト分のデータを要求する Wire.requestFrom(compassAddress, 2); //要求したデータが2バイト分来たら if(Wire.available()>1){ //1バイト分のデータの読み込み reading = Wire.read(); //読み込んだデータを8ビット左シフトしておく reading = reading << 8; //次の1バイト分のデータを読み込み //一つ目のデータと合成(2バイト) reading += Wire.read(); //2バイト分のデータを10で割る reading /= 10; //LCD PRINT lcd.setCursor(0,0);//0文字目0行にカーソルセット lcd.print(double(reading)); } //処理のために少し待つ(20Hz) delay(50); } |
赤外線モジュールのキー入力を表示する。 パーツ: @ARDUINO(MEGA2560)、AArduino用 赤外線キット(IR KitForArduino:IR Kit(SKU:DFR0107)) (株)秋月電子通商、 プログラム・サンプル (AUDUINO MEGAデジタルピンは、40を使用する) 今回は、AURDUINOソフトに備わっている ツール→シリアルモニタ で表示される画面に リモコンの押したキーを表示するプログラム。メーカーのソフトそのままで すぐに認識してくれた。 ![]() //http://www.dfrobot.com/wiki/index.php/IR_Kit(SKU:DFR0107) #define IR_BIT_LENGTH 32 // number of bits sent by IR remote #define FirstLastBit 15 // divide 32 bits into two 15 bit chunks for integer variables. Ignore center two bits. they are all the same. #define BIT_1 1500 // Binary 1 threshold (Microseconds) #define BIT_0 450 // Binary 0 threshold (Microseconds) #define BIT_START 4000 // Start bit threshold (Microseconds) #define IR_PIN 40 // IR Sensor pin int debug = 0; // flag as 1 to output raw IR pulse data stream length in microseconds int output_verify = 0; // flag as 1 to print decoded verification integers. same number for all buttons int output_key = 0; // flag as 1 to print decoded key integers int remote_verify = 16128; // verifies first bits are 11111100000000 different remotes may have different start codes void setup() { pinMode(IR_PIN, INPUT); Serial.begin(9600); } void loop() { int key = get_ir_key(); do_response(key); delay(130); // 2 cycle delay to cancel duplicate keypresses } int get_ir_key() { int pulse[IR_BIT_LENGTH]; int bits[IR_BIT_LENGTH]; do { } //Wait for a start bit while(pulseIn(IR_PIN, HIGH) < BIT_START); read_pulse(pulse); pulse_to_bits(pulse, bits); RemoteVerify(bits); return bits_to_int(bits); } void read_pulse(int pulse[]) { for (int i = 0; i < IR_BIT_LENGTH; i++) { pulse[i] = pulseIn(IR_PIN, HIGH); } } void pulse_to_bits(int pulse[], int bits[]) { if (debug) { Serial.println("-----"); } for(int i = 0; i < IR_BIT_LENGTH; i++) { if (debug) { Serial.println(pulse[i]); } if(pulse[i] > BIT_1) //is it a 1? { bits[i] = 1; } else if(pulse[i] > BIT_0) //is it a 0? { bits[i] = 0; } else //data is invalid... { Serial.println("Error"); } } } void RemoteVerify(int bits[]) { int result = 0; int seed = 1; //Convert bits to integer for(int i = 0 ; i < (FirstLastBit) ; i++) { if(bits[i] == 1) { result += seed; } seed *= 2; } if (output_verify) { Serial.print("Remote "); Serial.print(result); Serial.println(" verification code"); } if (remote_verify != result) { delay (60); get_ir_key(); } //verify first group of bits. delay for data stream to end, then try again. } int bits_to_int(int bits[]) { int result = 0; int seed = 1; //Convert bits to integer for(int i = (IR_BIT_LENGTH-FirstLastBit) ; i < IR_BIT_LENGTH ; i++) { if(bits[i] == 1) { result += seed; } seed *= 2; } return result; } void do_response(int key) { if (output_key) { Serial.print("Key "); Serial.println(key); } switch (key) { case 32640: // turns on UUT power Serial.println("POWER"); break; case 32385: // FUNC/STOP turns off UUT power Serial.println("FUNC/STOP"); break; case 32130: // |<< ReTest failed Test Serial.println("|<<"); break; case 32002: // >|| Test Serial.println(">||"); break; case 31875: // >>| perform selected test number Serial.println(">>|"); break; case 32512: // VOL+ turns on individual test beeper Serial.println("VOL+"); break; case 31492: // VOL- turns off individual test beeper Serial.println("VOL-"); break; case 31620: // v scroll down tests Serial.println("v"); break; case 31365: // ^ scroll up tests Serial.println("^"); break; case 30982: // EQ negative tests internal setup Serial.println("EQ"); break; case 30855: // ST/REPT Positive tests Select Test and Repeat Test Serial.println("ST/REPT"); break; case 31110: // 0 Serial.println("0"); break; case 30600: // 1 Serial.println("1"); break; case 30472: // 2 Serial.println("2"); break; case 30345: // 3 Serial.println("3"); break; case 30090: // 4 Serial.println("4"); break; case 29962: // 5 Serial.println("5"); break; case 29835: // 6 Serial.println("6"); break; case 29580: // 7 Serial.println("7"); break; case 29452: // 8 Serial.println("8"); break; case 29325: // 9 Serial.println("9"); break; default: { Serial.print("Key "); Serial.print(key); Serial.println(" not programmed"); } break; } } |
![]() |
ステッピングモーター制御(L6470 2相) @ストロベリーリナックス(L6470) A秋月電子通商(AE−L6470DRV) |
ステッピングモーター制御(ULN2003) ギア付き |
GPS(GT−730F)データをLCDに表示 |
サーボモーター制御(SC90) | LCDモジュール(16文字*2行) | コンパスモジュール(HMC6352)の 方位をLCDに表示 |
赤外線モジュールのキー入力を表示 |