ステッピングモーター制御(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;
}
}

ARDUINO(ボートで活用)

ステッピングモーター制御(L6470 2相)
@ストロベリーリナックス(L6470)
A秋月電子通商(AE−L6470DRV)
ステッピングモーター制御(ULN2003)
ギア付き
GPS(GT−730F)データをLCDに表示
サーボモーター制御(SC90) LCDモジュール(16文字*2行) コンパスモジュール(HMC6352)の
方位をLCDに表示
赤外線モジュールのキー入力を表示