![](https://habrastorage.org/files/c6b/3e4/420/c6b3e44200c44f969fdaea40d32996bd.jpg)
エレクトロニクスの基礎を学ぶ(そして実際に学ぶ)ことは、オンラインで行うのが最善です。 ルールやスキームなどを覚えるだけでなく、実際に学んだことをすぐに試してください。 そして、そのような機会は、ARDUINOとBluetoothを備えた無線制御マシンを提供します。
英語版マニュアルでは、デバイスのルートは中国語ですが、すべての象形文字も削除されていません。 ただし、これは非常に興味深いプロジェクトであり、多くのことを学ぶことができます。 実際のところ、ハードウェアとソフトウェアの両方をここで変更でき、新しいモジュールとソフトウェアのアドオンが追加されています。
Robotaleとは何ですか?
![](https://habrastorage.org/files/4da/3a0/493/4da3a049326745759fdac6e64f4f90ff.jpg)
開発者は、Arduinoマイクロコントローラーatmega-328コアに基づいて、プロジェクトをトレーニングおよび開発用電子システムとして位置付けます。 さらに、Bluetoothモジュール、赤外線モジュール、デバイスが障害物を回避するのに役立つセンサーがあります。 デバイスを制御するためのさまざまなプログラムと、追加モジュールをインストールしてデバイスに機能を追加できる拡張ボードが含まれています。
![](https://habrastorage.org/files/f71/d2f/030/f71d2f0302a043d6a7e43b781e8ef67a.jpg)
デバイスの仕様
- 電気モーター:6-9V(4個、各車輪に1個);
- 四輪
- モーターマウント;
- プレキシガラス板2枚;
- 制御ボードL298N;
- ARDUINO UNO328;
- センサー付き拡張ボード。
- PTZ
- サーボドライブ;
- 超音波モジュール;
- 赤外線センサー
- リモコン
- アダプター;
- Bluetoothモジュール。
ドライバー、ネジ、USBケーブルがデバイスに付属しています。
![](https://habrastorage.org/files/fcb/a88/98b/fcba8898b3894a83892885a2a1570caf.jpg)
どのように機能しますか?
機械は分解された状態で出荷されるため、自分の手で組み立てる必要があります。 詳細が豊富であるにもかかわらず、組み立ては非常に簡単で、子供もそれに対処します(ただし、ドライバーと、場合によってははんだ付けの経験が必要です)。 すでに初期段階で、この車を別々の部品から組み立てている人は、このすべてがどのように機能し、相互作用するかを理解できます。
![](https://habrastorage.org/files/fca/80d/fd8/fca80dfd80324368a5e17bb2c9a75da3.jpg)
すべてを組み立てた後、デバイスを制御し、ソフトウェアを完成させるPCまたはラップトップで、Arduino Unoの制御プログラムをインストールする必要があります。
必要に応じて、ハードウェアとプログラムのセットを変更して補足することができます-ここでは、欲望と機会(経験)だけがこの欲求の役割を果たします。 Robotale Kitは、子供と大人の両方が使用できる高度な電子デザイナーです。 もちろん、Arduinoでの作業はそれほど単純ではありませんが、より興味深いのは、機械を組み立てて追加のモジュールを接続する過程で学ぶことです。
![](https://habrastorage.org/files/b96/a4a/f9a/b96a4af9af2c465a8a004469158c22ea.jpg)
たとえば、Bluetoothモジュールを追加して、無線で送信されるコマンドを理解するように車に教えることができます。 ちなみに、このデバイスでは、Bluetoothガジェットとペアリングするときに、ペアリングコード「1234」を入力する必要があります。 その後、管理を試みることができます。
![](https://habrastorage.org/files/397/9c0/923/3979c09239e74ee7854e1fa8b3ba05e5.jpg)
たとえば、モバイルデバイスまたはラップトップ(タイプライターとペアになっているデバイス)のキーボードで文字「R」をクリックすると、赤いpin13 LEDが点滅することを確認できます。 これは、次のプログラムセクションを使用して実現できます。
コード
char val;
int ledpin = 13;
ボイド設定()
{
Serial.begin(9600);
pinMode(ledpin、OUTPUT);
}
ボイドループ()
{
val = Serial.read();
if(val == 'r')
{
digitalWrite(ledpin、HIGH);
遅延((500);
digitalWrite(ledpin、LOW);
遅延(500);
Serial.println( "keyes");
}
}
int ledpin = 13;
ボイド設定()
{
Serial.begin(9600);
pinMode(ledpin、OUTPUT);
}
ボイドループ()
{
val = Serial.read();
if(val == 'r')
{
digitalWrite(ledpin、HIGH);
遅延((500);
digitalWrite(ledpin、LOW);
遅延(500);
Serial.println( "keyes");
}
}
それから:
コードNo.2
/// ***********************************
int MotorRight1 = 5;
int MotorRight2 = 6;
int MotorLeft1 = 10;
int MotorLeft2 = 11;
ボイド設定()
{
Serial.begin(9600);
pinMode(MotorRight1、OUTPUT); //ピン8(PWM)
pinMode(MotorRight2、OUTPUT); //ピン9(PWM)
pinMode(MotorLeft1、OUTPUT); //ピン10(PWM)
pinMode(MotorLeft2、OUTPUT); //ピン11(PWM)
}
void go()//フォワード
{
digitalWrite(MotorRight1、LOW);
digitalWrite(MotorRight2、HIGH);
digitalWrite(MotorLeft1、LOW);
digitalWrite(MotorLeft2、HIGH);
}
左ボイド()/ /右折
{
digitalWrite(MotorRight1、HIGH);
digitalWrite(MotorRight2、LOW);
digitalWrite(MotorLeft1、LOW);
digitalWrite(MotorLeft2、HIGH);
}
右ボイド()/ /左折
{
digitalWrite(MotorRight1、LOW);
digitalWrite(MotorRight2、HIGH);
digitalWrite(MotorLeft1、HIGH);
digitalWrite(MotorLeft2、LOW);
}
ボイドストップ()/ /停止
{
digitalWrite(MotorRight1、LOW);
digitalWrite(MotorRight2、LOW);
digitalWrite(MotorLeft1、LOW);
digitalWrite(MotorLeft2、LOW);
}
void back()//チェックアウト
{
digitalWrite(MotorRight1、HIGH);
digitalWrite(MotorRight2、LOW);
digitalWrite(MotorLeft1、HIGH);
digitalWrite(MotorLeft2、LOW);;
}
ボイドループ()
{
char val = Serial.read();
Serial.write(val);
if(-1!= val){
if( 'W' == val)
go();
else if( 'A' == val)
左();
else if( 'D' == val)
右();
else if( 'S' == val)
戻る();
else if( 'Q' == val)
停止();
遅延(500);
}
他に
{
/ /停止();
遅延(500);
}
}
赤外線信号の認識、Bluetoothモジュールのコマンド、その他の機能など、すべての機能を使用する必要がある場合は、次のコードを使用する必要があります。
/// ********************************
#<IRremote.h>を含める
#<Servo.h>を含める
/ / ************************モーターピンの定義********************** ****
int MotorRight1 = 5;
int MotorRight2 = 6;
int MotorLeft1 = 10;
int MotorLeft2 = 11;
intカウンター= 0;
const int irReceiverPin = 2; //ピン2に接続されたIRレシーバーの出力信号
char val;
// ************************ IRcodeを検出するように設定****************** ** *****
長いIRfront = 0x00FFA25D; //コードを転送します
long IRback = 0x00FF629D; //チェックアウト
長いIRturnright = 0x00FFC23D; / /右
長いIRturnleft = 0x00FF02FD; //左
long IRstop = 0x00FFE21D; //停止します
long IRcny70 = 0x00FFA857; // CNY70自走モード
long IRAutorun = 0x00FF 906F; //自走モードの超音波
長いIRturnsmallleft = 0x00FF22DD;
/ / ***************************定義されたCNY70ピン******************** * ****************
const int SensorLeft = 7; //左センサー入力ピン
const int SensorMiddle = 4; / /センサー入力ピン
const int SensorRight = 3; //右センサー入力ピン
int SL; //左センサーの状態
int SM; / /センサーの状態
int SR; //正しいセンサーの状態
IRrecv irrecv(irReceiverPin); //赤外線信号IRrecvを受信するオブジェクトを定義します
decode_results結果; //デコード結果はdecode_resultsの構造変数になります
/ / ***************************定義された超音波ピン****************** ** **********
int inputPin = 13; //ピン超音波信号受信機の定義rx
int outputPin = 12; //超音波信号送信機ピン 'txを定義
int Fspeedd = 0; / /距離の前
int Rspeedd = 0; / /正しい距離
int Lspeedd = 0; / /左距離
int directionn = 0; / / = 8ポスト= 2左前と右= 6 = 4
サーボmyservo; // myservoを設定します
int delay_time = 250; //サーボモーターのステアリング後の整定時間
int Fgo = 8; //フォワード
int Rgo = 6; //右折します
int Lgo = 4; //左に曲がります
int Bgo = 2; //逆
/// ************************************************** *********************(セットアップ)
ボイド設定()
{
Serial.begin(9600);
pinMode(MotorRight1、OUTPUT); //ピン8(PWM)
pinMode(MotorRight2、OUTPUT); //ピン9(PWM)
pinMode(MotorLeft1、OUTPUT); //ピン10(PWM)
pinMode(MotorLeft2、OUTPUT); //ピン11(PWM)
irrecv.enableIRIn(); //赤外線デコードを開始します
pinMode(SensorLeft、INPUT); //左のセンサーを定義
pinMode(SensorMiddle、INPUT); / /定義センサー
pinMode(SensorRight、INPUT); //適切なセンサーの定義
digitalWrite(2、HIGH);
pinMode(inputPin、INPUT); //超音波入力ピンを定義
pinMode(outputPin、OUTPUT); //超音波出力ピンを定義します
myservo.attach(9); //サーボモーター出力セクション5ピン(PWM)を定義
}
/// ************************************************** ******************(無効)
void advance(int a)//フォワード
{
digitalWrite(MotorRight1、LOW);
digitalWrite(MotorRight2、HIGH);
digitalWrite(MotorLeft1、LOW);
digitalWrite(MotorLeft2、HIGH);
遅延(a * 100);
}
ボイド・ライト(int b)/ /右折(シングル・ホイール)
{
digitalWrite(MotorLeft1、LOW);
digitalWrite(MotorLeft2、HIGH);
digitalWrite(MotorRight1、LOW);
digitalWrite(MotorRight2、LOW);
遅延(b * 100);
}
void void(int c)/ /左折(単一ホイール)
{
digitalWrite(MotorRight1、LOW);
digitalWrite(MotorRight2、HIGH);
digitalWrite(MotorLeft1、LOW);
digitalWrite(MotorLeft2、LOW);
遅延(c * 100);
}
void turnR(int d)/ /右折(ホイール)
{
digitalWrite(MotorRight1、HIGH);
digitalWrite(MotorRight2、LOW);
digitalWrite(MotorLeft1、LOW);
digitalWrite(MotorLeft2、HIGH);
遅延(d * 100);
}
void turnL(int e)/ /左折(ホイール)
{
digitalWrite(MotorRight1、LOW);
digitalWrite(MotorRight2、HIGH);
digitalWrite(MotorLeft1、HIGH);
digitalWrite(MotorLeft2、LOW);
遅延(e * 100);
}
void stopp(int f)/ /停止
{
digitalWrite(MotorRight1、LOW);
digitalWrite(MotorRight2、LOW);
digitalWrite(MotorLeft1、LOW);
digitalWrite(MotorLeft2、LOW);
遅延(f * 100);
}
void back(int g)//チェックアウト
{
digitalWrite(MotorRight1、HIGH);
digitalWrite(MotorRight2、LOW);
digitalWrite(MotorLeft1、HIGH);
digitalWrite(MotorLeft2、LOW);;
遅延(g * 100);
}
ボイド検出()/ / 3つの角度を測定(前面左、右)
{
int delay_time = 250; //サーボモーターのステアリング後の整定時間
ask_pin_F(); //前から読む
if(Fspeedd <10)//距離が前の10 cm未満の場合
{
stopp(1); //出力データをクリアします
戻る(2); // 0.2秒チェックアウト
}
if(Fspeedd <25)//距離が前方の25 cm未満の場合
{
stopp(1); //出力データをクリアします
ask_pin_L(); //左から読みます
遅延(delay_time); //安定したサーボモーターを待ちます
ask_pin_R(); //正しい距離を読み取ります
遅延(delay_time); //安定したサーボモーターを待ちます
if(Lspeedd> Rspeedd)/ /距離が左から右よりも大きい場合
{
方向= Lgo; / /左へ
}
if(Lspeedd <= Rspeedd)/ /距離が左から右の距離以下である場合
{
directionn = Rgo; / /右へ
}
if(Lspeedd <15 && Rspeedd <15)//左右の距離が10 cm未満の場合
{
directionn = Bgo; / /あとに行く
}
}
その他/ /の前に25 cm以上追加
{
方向= Fgo; / /前進する
}
}
/// ************************************************** ****************************** ....
void ask_pin_F()//正面からの距離を測定する
{
myservo.write(90);
digitalWrite(outputPin、LOW); //超音波トランスミッターを低電圧2μsにします
delayMicroseconds(2);
digitalWrite(outputPin、HIGH); //超音波送信の高電圧を10μsにします。少なくとも10μs
delayMicroseconds(10);
digitalWrite(outputPin、LOW); //低電圧超音波トランスミッターを維持します
float Fdistance = pulseIn(inputPin、HIGH); //悪い時間差を読み取ります
距離=距離/ 5.8 / 10; / /時間距離に変わります(単位:cm)
Serial.print( "F distance:"); //出力距離(単位:cm)
Serial.println(距離); / /距離を表示
Fspeedd = fdistance; / / ReadingからFspeedd(以前の速度)に入る
}
/// ************************************************** **** +
void ask_pin_L()/ /左からの距離を測定
{
myservo.write(177);
遅延(delay_time);
digitalWrite(outputPin、LOW); //超音波トランスミッターを低電圧2μsにします
delayMicroseconds(2);
digitalWrite(outputPin、HIGH); //超音波送信の高電圧を10μsにします。少なくとも10μs
delayMicroseconds(10);
digitalWrite(outputPin、LOW); //低電圧超音波トランスミッターを維持します
float Ldistance = pulseIn(inputPin、HIGH); //悪い時間差を読み取ります
Ldistance = Ldistance / 5.8 / 10; / /時間距離に変わります(単位:cm)
Serial.print( "L distance:"); //出力距離(単位:cm)
Serial.println(距離); / /距離を表示
Lspeedd = ldistance; / /距離Lspeedd(左速度)に読み込まれます
}
/// ************************************************** ****************** ....
void ask_pin_R()/ /右からの距離を測定
{
myservo.write(5);
遅延(delay_time);
digitalWrite(outputPin、LOW); //超音波トランスミッターを低電圧2μsにします
delayMicroseconds(2);
digitalWrite(outputPin、HIGH); //超音波送信の高電圧を10μsにします。少なくとも10μs
delayMicroseconds(10);
digitalWrite(outputPin、LOW); //低電圧超音波トランスミッターを維持します
float Rdistance = pulseIn(inputPin、HIGH); //悪い時間差を読み取ります
Rdistance = Rdistance / 5.8 / 10; / /時間距離に変わります(単位:cm)
Serial.print( "R distance:"); //出力距離(単位:cm)
Serial.println(距離); / /距離を表示
Rspeedd = rdistance; / /距離Rspeedd(右速度)に読み込まれます
}
/// ************************************************** ********************************(ループ)
ボイドループ()
{
SL = digitalRead(SensorLeft);
SM = digitalRead(SensorMiddle);
SR = digitalRead(SensorRight);
performCommand();
/// ************************************************** ****************************通常の通常モード
if(irrecv.decode(&結果))
{/ /デコードが成功すると、赤外線信号のセットを受け取ります
/ ******************************************************* *********************** /
if(results.value == IRfront)//フォワード
{
前進(10); / /前進
}
/ ******************************************************* *********************** /
if(results.value == IRback)/ /チェックアウト
{
戻る(10); / /退職後
}
/ ******************************************************* *********************** /
if(results.value == IRturnright)/ /右に曲がる
{
右(6); //右折します
}
/ ******************************************************* *********************** /
if(results.value == IRturnleft)/ /左折
{
左(6); / /左折);
}
/ ******************************************************* *********************** /
if(results.value == IRstop)/ /停止
{
digitalWrite(MotorRight1、LOW);
digitalWrite(MotorRight2、LOW);
digitalWrite(MotorLeft1、LOW);
digitalWrite(MotorLeft2、LOW);
}
/// ************************************************** ************************ cny70モデルブラック自走モード:LOWホワイト:
if(results.value == IRcny70)
{
while(IRcny70)
{
SL = digitalRead(SensorLeft);
SM = digitalRead(SensorMiddle);
SR = digitalRead(SensorRight);
if(SM == HIGH)//黒い領域のセンサー内
{
if(SL == LOW&SR == HIGH)/ /左右の黒白、左に曲がる
{
digitalWrite(MotorRight1、LOW);
digitalWrite(MotorRight2、HIGH);
analogWrite(MotorLeft1、0);
analogWrite(MotorLeft2、80);
}
それ以外の場合(SR == LOW&SL == HIGH)/ /左右黒白、右折
{
analogWrite(MotorRight1、0); / /右折
analogWrite(MotorRight2、80);
digitalWrite(MotorLeft1、LOW);
digitalWrite(MotorLeft2、HIGH);
}
その他/ /両側が白色、直線
{
digitalWrite(MotorRight1、LOW);
digitalWrite(MotorRight2、HIGH);
digitalWrite(MotorLeft1、LOW);
digitalWrite(MotorLeft2、HIGH);
analogWrite(MotorLeft1,200);
analogWrite(MotorLeft2,200);
analogWrite(MotorRight1、200);
analogWrite(MotorRight2、200);
}
}
else / /白い領域のセンサー
{
if(SL == LOW&SR == HIGH)/ /左右の黒、白、高速左折
{
digitalWrite(MotorRight1、LOW);
digitalWrite(MotorRight2、HIGH);
digitalWrite(MotorLeft1、LOW);
digitalWrite(MotorLeft2、LOW);
}
それ以外の場合(SR == LOW&SL == HIGH)/ /左右の黒白、クイック右ターン
{
digitalWrite(MotorRight1、LOW);
digitalWrite(MotorRight2、LOW);
digitalWrite(MotorLeft1、LOW);
digitalWrite(MotorLeft2、HIGH);
}
他の/ /は白、停止
{
digitalWrite(MotorRight1、HIGH);
digitalWrite(MotorRight2、LOW);
digitalWrite(MotorLeft1、HIGH);
digitalWrite(MotorLeft2、LOW);;
}
}
if(irrecv.decode(&結果))
{
irrecv.resume();
Serial.println(results.value、HEX);
if(results.value == IRstop)
{
digitalWrite(MotorRight1、HIGH);
digitalWrite(MotorRight2、HIGH);
digitalWrite(MotorLeft1、HIGH);
digitalWrite(MotorLeft2、HIGH);
休憩;
}
}
}
results.value = 0;
}
/// *****************************************************自走モード超音波************************
if(results.value == IRAutorun)
{
while(IRAutorun)
{
myservo.write(90); //準備中のメジャーに戻ると、サーボモーターの位置が事前準備済みに戻ります
検出(); / /移動する場所に対する判断の角度と方向を測定する
if(directionn == 8)/ / directionn(direction)= 8(forward)の場合
{
if(irrecv.decode(&結果))
{
irrecv.resume();
Serial.println(results.value、HEX);
if(results.value == IRstop)
{
digitalWrite(MotorRight1、LOW);
digitalWrite(MotorRight2、LOW);
digitalWrite(MotorLeft1、LOW);
digitalWrite(MotorLeft2、LOW);
休憩;
}
}
results.value = 0;
前進(1); //通常順
Serial.print( "Advance"); / /表示方向(前方)
Serial.print( "");
}
if(directionn == 2)/ / directionn(direction)= 2(reverse)の場合
{
if(irrecv.decode(&結果))
{
irrecv.resume();
Serial.println(results.value、HEX);
if(results.value == IRstop)
{
digitalWrite(MotorRight1、LOW);
digitalWrite(MotorRight2、LOW);
digitalWrite(MotorLeft1、LOW);
digitalWrite(MotorLeft2、LOW);
休憩;
}
}
results.value = 0;
戻る(8); //リバース(車)
turnL(3); //少し左に移動します(死んだ路地で立ち往生するのを防ぐため)
Serial.print(「リバース」); / /表示方向(後方)
}
if(directionn == 6)/ / directionn(direction)= 6(右折)の場合
{
if(irrecv.decode(&結果))
{
irrecv.resume();
Serial.println(results.value、HEX);
if(results.value == IRstop)
{
digitalWrite(MotorRight1、LOW);
digitalWrite(MotorRight2、LOW);
digitalWrite(MotorLeft1、LOW);
digitalWrite(MotorLeft2、LOW);
休憩;
}
}
results.value = 0;
戻る(1);
turnR(6); //右折します
Serial.print(「右」); / /表示方向(左折)
}
if(directionn == 4)/ / directionn(direction)= 4(左折)の場合
{
if(irrecv.decode(&結果))
{
irrecv.resume();
Serial.println(results.value、HEX);
if(results.value == IRstop)
{
digitalWrite(MotorRight1、LOW);
digitalWrite(MotorRight2、LOW);
digitalWrite(MotorLeft1、LOW);
digitalWrite(MotorLeft2、LOW);
休憩;
}
}
results.value = 0;
戻る(1);
turnL(6); //左に曲がります
Serial.print(「左」); / /表示方向(右折)
}
if(irrecv.decode(&結果))
{
irrecv.resume();
Serial.println(results.value、HEX);
if(results.value == IRstop)
{
digitalWrite(MotorRight1、LOW);
digitalWrite(MotorRight2、LOW);
digitalWrite(MotorLeft1、LOW);
digitalWrite(MotorLeft2、LOW);
休憩;
}
}
}
results.value = 0;
}
/ *************************************************** *********************** /
他に
{
digitalWrite(MotorRight1、LOW);
digitalWrite(MotorRight2、LOW);
digitalWrite(MotorLeft1、LOW);
digitalWrite(MotorLeft2、LOW);
}
irrecv.resume(); //赤外線信号のセットを受け入れ続けます
}
}
void performCommand(){
if(Serial.available()){
val = Serial.read();
}
if(val == 'f'){/ /フォワード
前進(10);
} Else if(val == 'z'){/ / Stop Forward
stopp(10);
} Else if(val == 'b'){/ /後方
戻る(10);
} Else if(val == 'y'){/ /後方に停止
戻る(10);
} else if(val == 'l'){/ /右
turnR(10);
} Else if(val == 'r'){/ /左
turnL(10);
} Else if(val == 'v'){/ / Stop Turn
stopp(10);
} Else if(val == 's'){/ /停止
stopp(10);
}
}
int MotorRight1 = 5;
int MotorRight2 = 6;
int MotorLeft1 = 10;
int MotorLeft2 = 11;
ボイド設定()
{
Serial.begin(9600);
pinMode(MotorRight1、OUTPUT); //ピン8(PWM)
pinMode(MotorRight2、OUTPUT); //ピン9(PWM)
pinMode(MotorLeft1、OUTPUT); //ピン10(PWM)
pinMode(MotorLeft2、OUTPUT); //ピン11(PWM)
}
void go()//フォワード
{
digitalWrite(MotorRight1、LOW);
digitalWrite(MotorRight2、HIGH);
digitalWrite(MotorLeft1、LOW);
digitalWrite(MotorLeft2、HIGH);
}
左ボイド()/ /右折
{
digitalWrite(MotorRight1、HIGH);
digitalWrite(MotorRight2、LOW);
digitalWrite(MotorLeft1、LOW);
digitalWrite(MotorLeft2、HIGH);
}
右ボイド()/ /左折
{
digitalWrite(MotorRight1、LOW);
digitalWrite(MotorRight2、HIGH);
digitalWrite(MotorLeft1、HIGH);
digitalWrite(MotorLeft2、LOW);
}
ボイドストップ()/ /停止
{
digitalWrite(MotorRight1、LOW);
digitalWrite(MotorRight2、LOW);
digitalWrite(MotorLeft1、LOW);
digitalWrite(MotorLeft2、LOW);
}
void back()//チェックアウト
{
digitalWrite(MotorRight1、HIGH);
digitalWrite(MotorRight2、LOW);
digitalWrite(MotorLeft1、HIGH);
digitalWrite(MotorLeft2、LOW);;
}
ボイドループ()
{
char val = Serial.read();
Serial.write(val);
if(-1!= val){
if( 'W' == val)
go();
else if( 'A' == val)
左();
else if( 'D' == val)
右();
else if( 'S' == val)
戻る();
else if( 'Q' == val)
停止();
遅延(500);
}
他に
{
/ /停止();
遅延(500);
}
}
![](https://habrastorage.org/getpro/habr/post_images/90f/f67/2f0/90ff672f0b54038392d922b187a07002.jpg)
赤外線信号の認識、Bluetoothモジュールのコマンド、その他の機能など、すべての機能を使用する必要がある場合は、次のコードを使用する必要があります。
/// ********************************
#<IRremote.h>を含める
#<Servo.h>を含める
/ / ************************モーターピンの定義********************** ****
int MotorRight1 = 5;
int MotorRight2 = 6;
int MotorLeft1 = 10;
int MotorLeft2 = 11;
intカウンター= 0;
const int irReceiverPin = 2; //ピン2に接続されたIRレシーバーの出力信号
char val;
// ************************ IRcodeを検出するように設定****************** ** *****
長いIRfront = 0x00FFA25D; //コードを転送します
long IRback = 0x00FF629D; //チェックアウト
長いIRturnright = 0x00FFC23D; / /右
長いIRturnleft = 0x00FF02FD; //左
long IRstop = 0x00FFE21D; //停止します
long IRcny70 = 0x00FFA857; // CNY70自走モード
long IRAutorun = 0x00FF 906F; //自走モードの超音波
長いIRturnsmallleft = 0x00FF22DD;
/ / ***************************定義されたCNY70ピン******************** * ****************
const int SensorLeft = 7; //左センサー入力ピン
const int SensorMiddle = 4; / /センサー入力ピン
const int SensorRight = 3; //右センサー入力ピン
int SL; //左センサーの状態
int SM; / /センサーの状態
int SR; //正しいセンサーの状態
IRrecv irrecv(irReceiverPin); //赤外線信号IRrecvを受信するオブジェクトを定義します
decode_results結果; //デコード結果はdecode_resultsの構造変数になります
/ / ***************************定義された超音波ピン****************** ** **********
int inputPin = 13; //ピン超音波信号受信機の定義rx
int outputPin = 12; //超音波信号送信機ピン 'txを定義
int Fspeedd = 0; / /距離の前
int Rspeedd = 0; / /正しい距離
int Lspeedd = 0; / /左距離
int directionn = 0; / / = 8ポスト= 2左前と右= 6 = 4
サーボmyservo; // myservoを設定します
int delay_time = 250; //サーボモーターのステアリング後の整定時間
int Fgo = 8; //フォワード
int Rgo = 6; //右折します
int Lgo = 4; //左に曲がります
int Bgo = 2; //逆
/// ************************************************** *********************(セットアップ)
ボイド設定()
{
Serial.begin(9600);
pinMode(MotorRight1、OUTPUT); //ピン8(PWM)
pinMode(MotorRight2、OUTPUT); //ピン9(PWM)
pinMode(MotorLeft1、OUTPUT); //ピン10(PWM)
pinMode(MotorLeft2、OUTPUT); //ピン11(PWM)
irrecv.enableIRIn(); //赤外線デコードを開始します
pinMode(SensorLeft、INPUT); //左のセンサーを定義
pinMode(SensorMiddle、INPUT); / /定義センサー
pinMode(SensorRight、INPUT); //適切なセンサーの定義
digitalWrite(2、HIGH);
pinMode(inputPin、INPUT); //超音波入力ピンを定義
pinMode(outputPin、OUTPUT); //超音波出力ピンを定義します
myservo.attach(9); //サーボモーター出力セクション5ピン(PWM)を定義
}
/// ************************************************** ******************(無効)
void advance(int a)//フォワード
{
digitalWrite(MotorRight1、LOW);
digitalWrite(MotorRight2、HIGH);
digitalWrite(MotorLeft1、LOW);
digitalWrite(MotorLeft2、HIGH);
遅延(a * 100);
}
ボイド・ライト(int b)/ /右折(シングル・ホイール)
{
digitalWrite(MotorLeft1、LOW);
digitalWrite(MotorLeft2、HIGH);
digitalWrite(MotorRight1、LOW);
digitalWrite(MotorRight2、LOW);
遅延(b * 100);
}
void void(int c)/ /左折(単一ホイール)
{
digitalWrite(MotorRight1、LOW);
digitalWrite(MotorRight2、HIGH);
digitalWrite(MotorLeft1、LOW);
digitalWrite(MotorLeft2、LOW);
遅延(c * 100);
}
void turnR(int d)/ /右折(ホイール)
{
digitalWrite(MotorRight1、HIGH);
digitalWrite(MotorRight2、LOW);
digitalWrite(MotorLeft1、LOW);
digitalWrite(MotorLeft2、HIGH);
遅延(d * 100);
}
void turnL(int e)/ /左折(ホイール)
{
digitalWrite(MotorRight1、LOW);
digitalWrite(MotorRight2、HIGH);
digitalWrite(MotorLeft1、HIGH);
digitalWrite(MotorLeft2、LOW);
遅延(e * 100);
}
void stopp(int f)/ /停止
{
digitalWrite(MotorRight1、LOW);
digitalWrite(MotorRight2、LOW);
digitalWrite(MotorLeft1、LOW);
digitalWrite(MotorLeft2、LOW);
遅延(f * 100);
}
void back(int g)//チェックアウト
{
digitalWrite(MotorRight1、HIGH);
digitalWrite(MotorRight2、LOW);
digitalWrite(MotorLeft1、HIGH);
digitalWrite(MotorLeft2、LOW);;
遅延(g * 100);
}
ボイド検出()/ / 3つの角度を測定(前面左、右)
{
int delay_time = 250; //サーボモーターのステアリング後の整定時間
ask_pin_F(); //前から読む
if(Fspeedd <10)//距離が前の10 cm未満の場合
{
stopp(1); //出力データをクリアします
戻る(2); // 0.2秒チェックアウト
}
if(Fspeedd <25)//距離が前方の25 cm未満の場合
{
stopp(1); //出力データをクリアします
ask_pin_L(); //左から読みます
遅延(delay_time); //安定したサーボモーターを待ちます
ask_pin_R(); //正しい距離を読み取ります
遅延(delay_time); //安定したサーボモーターを待ちます
if(Lspeedd> Rspeedd)/ /距離が左から右よりも大きい場合
{
方向= Lgo; / /左へ
}
if(Lspeedd <= Rspeedd)/ /距離が左から右の距離以下である場合
{
directionn = Rgo; / /右へ
}
if(Lspeedd <15 && Rspeedd <15)//左右の距離が10 cm未満の場合
{
directionn = Bgo; / /あとに行く
}
}
その他/ /の前に25 cm以上追加
{
方向= Fgo; / /前進する
}
}
/// ************************************************** ****************************** ....
void ask_pin_F()//正面からの距離を測定する
{
myservo.write(90);
digitalWrite(outputPin、LOW); //超音波トランスミッターを低電圧2μsにします
delayMicroseconds(2);
digitalWrite(outputPin、HIGH); //超音波送信の高電圧を10μsにします。少なくとも10μs
delayMicroseconds(10);
digitalWrite(outputPin、LOW); //低電圧超音波トランスミッターを維持します
float Fdistance = pulseIn(inputPin、HIGH); //悪い時間差を読み取ります
距離=距離/ 5.8 / 10; / /時間距離に変わります(単位:cm)
Serial.print( "F distance:"); //出力距離(単位:cm)
Serial.println(距離); / /距離を表示
Fspeedd = fdistance; / / ReadingからFspeedd(以前の速度)に入る
}
/// ************************************************** **** +
void ask_pin_L()/ /左からの距離を測定
{
myservo.write(177);
遅延(delay_time);
digitalWrite(outputPin、LOW); //超音波トランスミッターを低電圧2μsにします
delayMicroseconds(2);
digitalWrite(outputPin、HIGH); //超音波送信の高電圧を10μsにします。少なくとも10μs
delayMicroseconds(10);
digitalWrite(outputPin、LOW); //低電圧超音波トランスミッターを維持します
float Ldistance = pulseIn(inputPin、HIGH); //悪い時間差を読み取ります
Ldistance = Ldistance / 5.8 / 10; / /時間距離に変わります(単位:cm)
Serial.print( "L distance:"); //出力距離(単位:cm)
Serial.println(距離); / /距離を表示
Lspeedd = ldistance; / /距離Lspeedd(左速度)に読み込まれます
}
/// ************************************************** ****************** ....
void ask_pin_R()/ /右からの距離を測定
{
myservo.write(5);
遅延(delay_time);
digitalWrite(outputPin、LOW); //超音波トランスミッターを低電圧2μsにします
delayMicroseconds(2);
digitalWrite(outputPin、HIGH); //超音波送信の高電圧を10μsにします。少なくとも10μs
delayMicroseconds(10);
digitalWrite(outputPin、LOW); //低電圧超音波トランスミッターを維持します
float Rdistance = pulseIn(inputPin、HIGH); //悪い時間差を読み取ります
Rdistance = Rdistance / 5.8 / 10; / /時間距離に変わります(単位:cm)
Serial.print( "R distance:"); //出力距離(単位:cm)
Serial.println(距離); / /距離を表示
Rspeedd = rdistance; / /距離Rspeedd(右速度)に読み込まれます
}
/// ************************************************** ********************************(ループ)
ボイドループ()
{
SL = digitalRead(SensorLeft);
SM = digitalRead(SensorMiddle);
SR = digitalRead(SensorRight);
performCommand();
/// ************************************************** ****************************通常の通常モード
if(irrecv.decode(&結果))
{/ /デコードが成功すると、赤外線信号のセットを受け取ります
/ ******************************************************* *********************** /
if(results.value == IRfront)//フォワード
{
前進(10); / /前進
}
/ ******************************************************* *********************** /
if(results.value == IRback)/ /チェックアウト
{
戻る(10); / /退職後
}
/ ******************************************************* *********************** /
if(results.value == IRturnright)/ /右に曲がる
{
右(6); //右折します
}
/ ******************************************************* *********************** /
if(results.value == IRturnleft)/ /左折
{
左(6); / /左折);
}
/ ******************************************************* *********************** /
if(results.value == IRstop)/ /停止
{
digitalWrite(MotorRight1、LOW);
digitalWrite(MotorRight2、LOW);
digitalWrite(MotorLeft1、LOW);
digitalWrite(MotorLeft2、LOW);
}
/// ************************************************** ************************ cny70モデルブラック自走モード:LOWホワイト:
if(results.value == IRcny70)
{
while(IRcny70)
{
SL = digitalRead(SensorLeft);
SM = digitalRead(SensorMiddle);
SR = digitalRead(SensorRight);
if(SM == HIGH)//黒い領域のセンサー内
{
if(SL == LOW&SR == HIGH)/ /左右の黒白、左に曲がる
{
digitalWrite(MotorRight1、LOW);
digitalWrite(MotorRight2、HIGH);
analogWrite(MotorLeft1、0);
analogWrite(MotorLeft2、80);
}
それ以外の場合(SR == LOW&SL == HIGH)/ /左右黒白、右折
{
analogWrite(MotorRight1、0); / /右折
analogWrite(MotorRight2、80);
digitalWrite(MotorLeft1、LOW);
digitalWrite(MotorLeft2、HIGH);
}
その他/ /両側が白色、直線
{
digitalWrite(MotorRight1、LOW);
digitalWrite(MotorRight2、HIGH);
digitalWrite(MotorLeft1、LOW);
digitalWrite(MotorLeft2、HIGH);
analogWrite(MotorLeft1,200);
analogWrite(MotorLeft2,200);
analogWrite(MotorRight1、200);
analogWrite(MotorRight2、200);
}
}
else / /白い領域のセンサー
{
if(SL == LOW&SR == HIGH)/ /左右の黒、白、高速左折
{
digitalWrite(MotorRight1、LOW);
digitalWrite(MotorRight2、HIGH);
digitalWrite(MotorLeft1、LOW);
digitalWrite(MotorLeft2、LOW);
}
それ以外の場合(SR == LOW&SL == HIGH)/ /左右の黒白、クイック右ターン
{
digitalWrite(MotorRight1、LOW);
digitalWrite(MotorRight2、LOW);
digitalWrite(MotorLeft1、LOW);
digitalWrite(MotorLeft2、HIGH);
}
他の/ /は白、停止
{
digitalWrite(MotorRight1、HIGH);
digitalWrite(MotorRight2、LOW);
digitalWrite(MotorLeft1、HIGH);
digitalWrite(MotorLeft2、LOW);;
}
}
if(irrecv.decode(&結果))
{
irrecv.resume();
Serial.println(results.value、HEX);
if(results.value == IRstop)
{
digitalWrite(MotorRight1、HIGH);
digitalWrite(MotorRight2、HIGH);
digitalWrite(MotorLeft1、HIGH);
digitalWrite(MotorLeft2、HIGH);
休憩;
}
}
}
results.value = 0;
}
/// *****************************************************自走モード超音波************************
if(results.value == IRAutorun)
{
while(IRAutorun)
{
myservo.write(90); //準備中のメジャーに戻ると、サーボモーターの位置が事前準備済みに戻ります
検出(); / /移動する場所に対する判断の角度と方向を測定する
if(directionn == 8)/ / directionn(direction)= 8(forward)の場合
{
if(irrecv.decode(&結果))
{
irrecv.resume();
Serial.println(results.value、HEX);
if(results.value == IRstop)
{
digitalWrite(MotorRight1、LOW);
digitalWrite(MotorRight2、LOW);
digitalWrite(MotorLeft1、LOW);
digitalWrite(MotorLeft2、LOW);
休憩;
}
}
results.value = 0;
前進(1); //通常順
Serial.print( "Advance"); / /表示方向(前方)
Serial.print( "");
}
if(directionn == 2)/ / directionn(direction)= 2(reverse)の場合
{
if(irrecv.decode(&結果))
{
irrecv.resume();
Serial.println(results.value、HEX);
if(results.value == IRstop)
{
digitalWrite(MotorRight1、LOW);
digitalWrite(MotorRight2、LOW);
digitalWrite(MotorLeft1、LOW);
digitalWrite(MotorLeft2、LOW);
休憩;
}
}
results.value = 0;
戻る(8); //リバース(車)
turnL(3); //少し左に移動します(死んだ路地で立ち往生するのを防ぐため)
Serial.print(「リバース」); / /表示方向(後方)
}
if(directionn == 6)/ / directionn(direction)= 6(右折)の場合
{
if(irrecv.decode(&結果))
{
irrecv.resume();
Serial.println(results.value、HEX);
if(results.value == IRstop)
{
digitalWrite(MotorRight1、LOW);
digitalWrite(MotorRight2、LOW);
digitalWrite(MotorLeft1、LOW);
digitalWrite(MotorLeft2、LOW);
休憩;
}
}
results.value = 0;
戻る(1);
turnR(6); //右折します
Serial.print(「右」); / /表示方向(左折)
}
if(directionn == 4)/ / directionn(direction)= 4(左折)の場合
{
if(irrecv.decode(&結果))
{
irrecv.resume();
Serial.println(results.value、HEX);
if(results.value == IRstop)
{
digitalWrite(MotorRight1、LOW);
digitalWrite(MotorRight2、LOW);
digitalWrite(MotorLeft1、LOW);
digitalWrite(MotorLeft2、LOW);
休憩;
}
}
results.value = 0;
戻る(1);
turnL(6); //左に曲がります
Serial.print(「左」); / /表示方向(右折)
}
if(irrecv.decode(&結果))
{
irrecv.resume();
Serial.println(results.value、HEX);
if(results.value == IRstop)
{
digitalWrite(MotorRight1、LOW);
digitalWrite(MotorRight2、LOW);
digitalWrite(MotorLeft1、LOW);
digitalWrite(MotorLeft2、LOW);
休憩;
}
}
}
results.value = 0;
}
/ *************************************************** *********************** /
他に
{
digitalWrite(MotorRight1、LOW);
digitalWrite(MotorRight2、LOW);
digitalWrite(MotorLeft1、LOW);
digitalWrite(MotorLeft2、LOW);
}
irrecv.resume(); //赤外線信号のセットを受け入れ続けます
}
}
void performCommand(){
if(Serial.available()){
val = Serial.read();
}
if(val == 'f'){/ /フォワード
前進(10);
} Else if(val == 'z'){/ / Stop Forward
stopp(10);
} Else if(val == 'b'){/ /後方
戻る(10);
} Else if(val == 'y'){/ /後方に停止
戻る(10);
} else if(val == 'l'){/ /右
turnR(10);
} Else if(val == 'r'){/ /左
turnL(10);
} Else if(val == 'v'){/ / Stop Turn
stopp(10);
} Else if(val == 's'){/ /停止
stopp(10);
}
}
実際、マシンは設定が非常に柔軟です。新しいプログラムを作成して機能の拡張を求めることができるためです(特に他のモジュールを接続する場合-パッケージに含まれているものだけでなく、追加の要素も接続できます)。 上に示されているのはほんの一例であり、実際には数十個あります。
結論 : Robotaleは 、電子工学の基礎、特にARDUINOの動作原理を研究するように設計されています。 トレーニングはインタラクティブな形式で実施され、車の所有者は最も効果的な方法、つまり理論から実践への瞬時の移行を使用してトレーニングされます。