隠居エンジニアのものづくり

自転車 電子工作 ラジコン ロボカップジュニア CAD レーザー加工機

ダイセン電子工業さんのセンサをArduinoで使う

ロボカップジュニアの定番ロボットキットTJ3を使っていて、Arduino UNO、Arduino Microに移行する人は多いように思います。

移行を考える人達は、C言語での開発がある程度できるので解説の必要がないかもしれませんが、ダイセン電子工業さんのセンサをArduinoで使用する方法をまとめます。

 

アナログポート(A0,A1,A2,A3に接続して”analogRead(pin)”でデータ取得)に接続して使うセンサ

ラインセンサー

ラインセンサー | ロボット,センサー | 株式会社ダイセン電子工業 (daisen-netstore.com)
ホワイトラインセンサー

ホワイトラインセンサー | ロボット,センサー | 株式会社ダイセン電子工業 (daisen-netstore.com)
シングルパルスボールセンサー

シングルパルスボールセンサー | ロボット,センサー | 株式会社ダイセン電子工業 (daisen-netstore.com)
反射型パルスボールセンサー

反射型パルスボールセンサー | ロボット,センサー | 株式会社ダイセン電子工業 (daisen-netstore.com)
カラーファインダー(3ピンのアナログ出力側を使用)

 

デジタルポート(2,3,4,5,6,7,8,9,10.11,12,13に接続して"pulseIn(pin, HIGH)"でデータ取得)に接続して使うセンサ

超音波センサー

超音波距離センサー | ロボット,センサー | 株式会社ダイセン電子工業 (daisen-netstore.com)

 

Arduino IDEのスケッチ例にサンプルプログラムがあります。

f:id:Blackbox_crusher:20210107233725p:plain

Arduino IDEのスケッチ例”Ping”が超音波センサーサンプルプログラム

デジタルポート"7"に接続すればシリアルモニタで距離が見れます。

サンプルプログラムの”const int pingPin = 7;”の数字を変更すればポート変更ができます。

 

I2Cポート(SDA=A4 SCL=A5に接続して”Wireライブラリ”を用いてデータ取得)に接続して使うセンサ

9Dコンパス

 9Dコンパス | ロボット,センサー | 株式会社ダイセン電子工業 (daisen-netstore.com)

 

”ツール”→”ライブラリ管理”を左クリックするとライブラリの管理ツールが開きます。

9Dコンパスに使用されているBNO055のライブラリが検索できるのですが、あまり上手くいかなかったので、データシートを読んでレジスタ設定を行って使っています。

f:id:Blackbox_crusher:20210107234728p:plain

ライブラリ管理ツール

BNO055ライブラリを使わないサンプルプログラム

/*
Name: BNO055_All_Data.ino
Created: ****/**/** **:**:**
Author: ***********
*/

#include <Wire.h>

#define BNO055 0x28 //9軸センサ IICアドレス

volatile int RET_MSG;
volatile int DIR;
volatile int GYRO;
volatile int PITCH;
volatile int ROLL;

void setup()
{
Serial.begin(115200);
Wire.begin(); //I2C通信開始
Wire.beginTransmission(BNO055);
Wire.write(0x3B); //register設定
Wire.write(0x00);
RET_MSG = Wire.endTransmission(); // データの送信と終了処理
if (RET_MSG == 0) {
}
else {
Serial.print("ERROR NO.="); //通信出来ない
Serial.println(RET_MSG);
}

Wire.beginTransmission(BNO055);
Wire.write(0x41); //register設定
Wire.write(0x21);
Wire.write(0x04);
RET_MSG = Wire.endTransmission(); // データの送信と終了処理
if (RET_MSG == 0) {
}
else {
Serial.print("ERROR NO.="); //通信出来ない
Serial.println(RET_MSG);
}

Wire.beginTransmission(BNO055);
Wire.write(0x3D); //register設定
Wire.write(0x0C);
RET_MSG = Wire.endTransmission(); // データの送信と終了処理
if (RET_MSG == 0) {
}
else {
Serial.print("ERROR NO.="); //通信出来ない
Serial.println(RET_MSG);
}
}

void loop()
{

DIR = getDIR(0);
Serial.print(DIR);
Serial.print("\t");

GYRO = getGYRO(0);
Serial.print(GYRO);
Serial.print("\t");

PITCH = getPITCH(0);
Serial.print(PITCH);
Serial.print("\t");

ROLL = getROLL(0);
Serial.println(ROLL);
delay(1000);

}


unsigned int getGYRO(unsigned char) //ジャイロ角速度を読み込み。
{
typedef union { //受信データ用共用体
unsigned int W;
struct {
unsigned char L;
unsigned char H;
};
} U_UINT;
U_UINT data; // 受信データ
int reg; //レジスターアドレス
reg = 0x18; // Register 0x1E:GYRO_DATA_Z (LSB-MSB)
Wire.beginTransmission(BNO055); //通信開始
Wire.write(reg); //register
Wire.endTransmission(); //通信終了

Wire.requestFrom(BNO055, 2);
if (Wire.available() > 1) {
data.L = Wire.read(); //1バイト分のデータの読み込み
data.H = Wire.read(); //次の1バイト分のデータを読み込み
}
return (data.W);
}

unsigned int getDIR(unsigned char) //ヘッドアップ角度を読み込み。
{
typedef union { //受信データ用共用体
unsigned int W;
struct {
unsigned char L;
unsigned char H;
};
} U_UINT;
U_UINT data; // 受信データ
int reg; //レジスターアドレス
reg = 0x1A; // Register 0x1A:dir(EUL_DATA_X LSB-MSB)
Wire.beginTransmission(BNO055); //通信開始
Wire.write(reg); //register
Wire.endTransmission(); //通信終了

Wire.requestFrom(BNO055, 2);
if (Wire.available() > 1) {
data.L = Wire.read(); //1バイト分のデータの読み込み
data.H = Wire.read(); //次の1バイト分のデータを読み込み
}
data.W = data.W / 16;
return (data.W);
}

unsigned int getROLL(unsigned char) //ロール角度を読み込み。
{
typedef union { //受信データ用共用体
unsigned int W;
struct {
unsigned char L;
unsigned char H;
};
} U_UINT;
U_UINT data; // 受信データ
int reg; //レジスターアドレス
reg = 0x1C; // Register 0x1C:ROLL(EUL_DATA_Y LSB-MSB)
Wire.beginTransmission(BNO055); //通信開始
Wire.write(reg); //register
Wire.endTransmission(); //通信終了

Wire.requestFrom(BNO055, 2);
if (Wire.available() > 1) {
data.L = Wire.read(); //1バイト分のデータの読み込み
data.H = Wire.read(); //次の1バイト分のデータを読み込み
}
return (data.W);
}

unsigned int getPITCH(unsigned char) //ピッチ角度を読み込み。
{
typedef union { //受信データ用共用体
unsigned int W;
struct {
unsigned char L;
unsigned char H;
};
} U_UINT;
U_UINT data; // 受信データ
int reg; //レジスターアドレス
reg = 0x1E; // Register 0x1E:PITCH(LSB-MSB)
Wire.beginTransmission(BNO055); //通信開始
Wire.write(reg); //register
Wire.endTransmission(); //通信終了

Wire.requestFrom(BNO055, 2);
if (Wire.available() > 1) {
data.L = Wire.read(); //1バイト分のデータの読み込み
data.H = Wire.read(); //次の1バイト分のデータを読み込み
}
return (data.W);
}

 

データ取得間隔の最小時間(サンプルプログラムは1000ms間隔でデータ取得)などBNO055の限界性能を引き出したい方はデータシートを熟読して下さい。