SSブログ
ロボット制作(tankun-mk1) ブログトップ

ソース部分作成3 (1-9.ソース:共通関数) [ロボット制作(tankun-mk1)] [ロボット制作(tankun-mk1)]

おはようぼざいます。結局、遅くなりました[がく~(落胆した顔)]

前回、中途半端になっていた各関数を紹介していきます。

各関数を作成しているのは色んな箇所で似たような処理をする部分を
一か所にまとめることで単純に書くソース量を減らすのと、
変更があった場合に修正箇所を少なくできるためです

[モータ操作]
まずはキャタピラ部分のモータ操作。
呼び元からは「前進」「右旋回」など動く方向だけを与えて、
関数の中で両モータの前進・後退を制御します。
void motor_move( int mode ) {
  //                   GO    STOP  LEFT  RIGHT  BACK
  int motor_0_0[6] = { HIGH, HIGH, LOW,  HIGH,  LOW};
  int motor_0_1[6] = { LOW,  HIGH, HIGH, LOW,   HIGH};
  int motor_1_0[6] = { HIGH, HIGH, HIGH, LOW,   LOW};
  int motor_1_1[6] = { LOW,  HIGH, LOW,  HIGH,  HIGH};
  short delay_time[6] = { 800, 1000, 1100, 1100, 1000 };

  digitalWrite( PIN_MTR_LEFT_GO,    motor_0_0[mode] );
  digitalWrite( PIN_MTR_LEFT_BACK,  motor_0_1[mode] );
  digitalWrite( PIN_MTR_RIGHT_GO,   motor_1_0[mode] );
  digitalWrite( PIN_MTR_RIGHT_BACK, motor_1_1[mode] );
  
  delay( delay_time[mode] );
  return;
}


[超音波センサの距離取得]
超音波センサから距離を取得する関数と、
前方に障害物があるかチェックする関数です。
チェックは引数でエラー距離を受ける事で汎用的にしています。
int check_sonic_sensor_dst( int err_dst, int mode) {
  float Distance;

  // ----------------------------------------------
  // 距離を取得
  // ----------------------------------------------
  Distance = get_sonic_sensor_dst();
  if ( Distance == 3 ) {
    Distance = get_sonic_sensor_dst();
  }

  if ( ( Distance  >= 5 ) && ( Distance <= err_dst ) ) {
    motor_move(MTR_SET_MODE_STOP);
    // 引数で受けたエラー距離を超えた
    Serial.print("kyo'ri  senti',me-'toru");
    delay(3500);

    return 1;
  }

//  if( mode == 1 ) {
//    Serial.print("kyo'ri  senti',me-'toru");
//    delay(3000);
//  }
  
  return 0;
}

int get_sonic_sensor_dst() {
  int Duration;
  float Distance;

  int pin_trig=PIN_SENSOR_FRONT_TRIG;
  int pin_echo=PIN_SENSOR_FRONT_ECHO;

  // 距離を求めるおまじない  
  digitalWrite( pin_trig, LOW );
  delayMicroseconds(1);
  digitalWrite( pin_trig, HIGH );
  delayMicroseconds(1);
  digitalWrite( pin_trig, LOW );

  // 距離を取得
  Duration = pulseIn( pin_echo, HIGH );
//    Serial.print(Duration);
//    Serial.println("Duration");
  if( Duration > 0 ) {
    // 距離をcmに変換
    Distance = Duration /2;
    Distance = Distance*340*100/1000000;

//    Serial.print(Distance);
//    Serial.println("Distance");

    return Distance;
  }else {
    return 3;
  }
}


[サーボの制御]
引数で受けた角度にサーボを回転させて、一定時間のディレイをいれてます

void exec_sensor_servo_ungle(int ungle) {
  servo_front.write(ungle);
  delay(SERVO_UNGLE_DELAY_TIME);

  return;
}


[次の行き先チェック]
この関数は
 1.進みたい方向にサーボを回転させて
 2.超音波センサで、その方向に障害物があるかチェックして
 3.障害物がなければ進む
という動きです。
先に右をチェックして、障害物があれば左をチェックして、
さらに障害物がある場合は少し下がっています。

void set_next_away() {
  int Dst_Check=0;
  int Mode=MTR_SET_MODE_RIGHT;

  exec_sensor_servo_ungle(SERVO_UNGLE_RIGHT);
  delay(1000);
  Dst_Check=check_sonic_sensor_dst(SENSOR_SIDE_ERROR_DST, 1);
  if ( Dst_Check == 0 ) {
    delay(500);
    Serial.println("mi'gini;susu'mi,masu'");
    delay(3000);
  }else {
    delay(100);
    exec_sensor_servo_ungle(SERVO_UNGLE_FRONT);
    delay(100);
    exec_sensor_servo_ungle(SERVO_UNGLE_LEFT);
    delay(500);
    Dst_Check=check_sonic_sensor_dst(SENSOR_SIDE_ERROR_DST, 1);
    if ( Dst_Check == 0 ) {
      Mode=MTR_SET_MODE_LEFT;
      delay(500);
//      Serial.println("hida'rini;maga'ri,ma'-su");
      Serial.println("hida'rini;susu'mi,masu'");
      delay(3000);
    }
  }

    delay(100);
  exec_sensor_servo_ungle(SERVO_UNGLE_FRONT);
    delay(100);

  if ( Dst_Check == 0 ) {
    motor_move(Mode);
    motor_move(MTR_SET_MODE_STOP);
    delay(100);
    motor_move(MTR_SET_MODE_STOP);
    motor_move(MTR_SET_MODE_GO);
    
  }else {
    motor_move(MTR_SET_MODE_BACK);
  }

  return;
}


かなり長くなりましたがこんな感じです。
各関数の説明が雑なので、折を見て補足していきますね。

では次回は、、、ついに完成かも[exclamation&amp;question]

ソース部分作成2 (1-8.ソース:loop関数) [ロボット制作(tankun-mk1)]

おはようぼざいます。

今回はloop関数について説明していきます。

全体の動作としては以下です。
 1)開始スイッチが押されたかをチェックする
 2)押されたらwhile(1)回り以下を検出するまで進む
 2-1)停止スイッチが押されたか
 2-2)前方に障害物を発見したか
 3)前方に障害物を発見したら以下を行う
 4)モータを止めて右と左に障害物があるかチェック
 5)障害物がない方向に進む
 6)左右両方に障害物がある場合は少し下がる

ただし「距離を求める」「サーボを回転させる」などの
各動作はサブ関数化しており次回紹介します。
(なるべく早く更新するようにします)

void loop() {
  int Dst_Check=0;

  // 開始スイッチが押されたら動作を開始する

  // 開始スイッチが押されたかチェック
  sw_start = digitalRead(PIN_SW_START);
  sw_stop = digitalRead(PIN_SW_STOP);
  if ( sw_start == 1 ) {
    Serial.println("susumi;ma'-su");
    delay(1500);  
    
    // サーボモータを正面に
    exec_sensor_servo_ungle(SERVO_UNGLE_FRONT);    
    motor_move(MTR_SET_MODE_GO);

    // 停止スイッチが押されるまで回る
    while(1) {
      Dst_Check=check_sonic_sensor_dst(SENSOR_FRONT_ERROR_DST, 0);
      if ( Dst_Check == 1 ) {
        delay(1000);
        set_next_away();
      }

      // 停止スイッチが押されたかチェック
      sw_stop = digitalRead(PIN_SW_STOP);
      if ( sw_stop == 1 ) {
        // モータを止める
        motor_move(MTR_SET_MODE_STOP);

        delay(100);  
        Serial.println("tomari';ma-su");
        delay(2000);  

        break;
      }

      delay(1000);
    }
  }

  sw_start = 0;
  sw_stop = 0;
  
  delay(1000);  
}


こんな感じです[ひらめき]

では、次回はサブ関数を紹介して具体的な動作を見ていきまーす[右斜め上]

ソース部分作成1 (1-7.ソース:定義とsetup関数) [ロボット制作(tankun-mk1)]

おはようございます[わーい(嬉しい顔)]
今日からロボット作成のソース部分を紹介していきます。

まずは、定義部分とsetup関数から[右斜め上]

最初に定義部分

// サーボのインクルード
#include 

// 前方の超音波センサー
#define PIN_SENSOR_FRONT_ECHO      2
#define PIN_SENSOR_FRONT_TRIG      3

// スタート・ストップスイッチ
#define PIN_SW_START        4
#define PIN_SW_STOP         5

// モータ
#define PIN_MTR_LEFT_GO     7
#define PIN_MTR_LEFT_BACK   6
#define PIN_MTR_RIGHT_GO    9
#define PIN_MTR_RIGHT_BACK  8

// 前方のサーボ
#define PIN_SERVO_FRONT      10

// ----------------------------------------
// 制御コード
// ----------------------------------------
#define MTR_SET_MODE_GO     0
#define MTR_SET_MODE_STOP   1
#define MTR_SET_MODE_LEFT   2
#define MTR_SET_MODE_RIGHT  3
#define MTR_SET_MODE_BACK   4

// ----------------------------------------
// サーボ制御
// ----------------------------------------
#define SERVO_UNGLE_FRONT  90
#define SERVO_UNGLE_RIGHT  25
#define SERVO_UNGLE_LEFT  155

#define SERVO_UNGLE_DELAY_TIME 1500

// センサー
#define SENSOR_FRONT_ERROR_DST 14
#define SENSOR_SIDE_ERROR_DST 20

// =======================================
// グローバル変数定義
// =======================================
// ----------------------------------------------
// サーボ
// ----------------------------------------------
Servo servo_front;
// ----------------------------------------------
// スイッチ
// ----------------------------------------------
int sw_start,sw_stop;


[define部分]
PIN_XX:Arduinoデジタルピン接続番号の定義です。
MTR_XX:モータの進む、止まる、旋回の定義です。
     ここの使い方は追々、説明します。
SERVO_XX:サーボモータの回転角度と回転待ち時間です。
SENSOR_XX:進行方向に障害物があるかのチェック距離(cm)です。

[グローバル変数]
seup関数,loop関数など複数の関数で使用する定義を
ここに書くことで全関数で使用可能になります。
servo_front:サーボモータの定義です。setup関数で初期化を行い、
      loop関数で横に向けたりと回転させます。
sw_start,stop:スタート、ストップボタンの定義です。

setup関数はこんな感じです。
void setup() {
  // ----------------------------------------------
  // シリアル設定
  // ----------------------------------------------
  Serial.begin(9600);
  Serial.println("Hello!");

  // ----------------------------------------------
  // ピン設定
  // ----------------------------------------------

  // スイッチ
  pinMode( PIN_SW_START, INPUT );
  pinMode( PIN_SW_STOP, INPUT );
  // モーター
  pinMode( PIN_MTR_RIGHT_GO, OUTPUT );
  pinMode( PIN_MTR_RIGHT_BACK, OUTPUT );
  pinMode( PIN_MTR_LEFT_GO, OUTPUT );
  pinMode( PIN_MTR_LEFT_BACK, OUTPUT );
  
  // 前方の超音波センサー
  pinMode( PIN_SENSOR_FRONT_TRIG, OUTPUT);
  pinMode( PIN_SENSOR_FRONT_ECHO, INPUT);

  // 前方のサーボセンサー
  servo_front.attach(PIN_SERVO_FRONT);
  exec_sensor_servo_ungle(SERVO_UNGLE_FRONT);

  // スイッチをOFF(LOW)に初期化
  sw_start=LOW;
  sw_stop=LOW;
}

void exec_sensor_servo_ungle(int ungle) {
  servo_front.write(ungle);
  delay(SERVO_UNGLE_DELAY_TIME);

  return;
}


[シリアル定義]
いつものシリアル設定です。

[ピン設定]
pinMode関数はArduinoに接続するピンの初期化です。
defineで定義した各変数を使用して初期化します。

[前方のサーボセンサー]
attachで使用するピンを定義し、
exec_sensor_servo_ungle関数は自前定義で、
この関数でサーボを回転させます。
今回は正面の90℃に設定します。

[exec_sensor_servo_ungle関数]
引数で受けた角度でサーボモータを回転させる関数です。
servo_front.writeが回転で、引数で受けた角度を設定します。
回転中に次の処理を行うと動作が不安定になる可能性があるので
delay関数で少し時間待ちを与えて回転が終わるまで待ちます。

今回はこんな感じです。

次回は本処理のloop関数を解説していきまーす。

電子回路部分作成2 (1-6.回路:音声部分) [ロボット制作(tankun-mk1)]

おはようございます。すみません、完全に放置してました[ふらふら]

さて久しぶりにロボット作成していきます。
今回は音声回路部分です。
P1060187.jpg
ーーーーーーーーーーーーーーーーーーーーーーーーーーー
まずは音声合成LSI。
[上段(左から)]
  7番目GND:ブレッドボードのGND部分と接続(*1) 
  9番目VCC:ブレッドボードの3.3V部分と接続
 14番目PMOD1:ブレッドボードの3.3V部分と接続
[下段(左から)]
  2番目RXD:Arduinoのデジタル1番ピン(TX)
  4番目SMOD0:ブレッドボードの3.3V部分と接続
  5番目SMOD1:ブレッドボードの3.3V部分と接続
  8番目VCC:ブレッドボードの3.3V部分と接続
  9番目GND:ブレッドボードのGND部分と接続
  *8ー9番:0.1uFのコンデンサ
 12番目:47KΩ抵抗でオペアンプとの間の空いている場所へ
      そこから0.1uFコンデンサを経由してOPアンプの下段3番へ
 14番目PMOD0:ブレッドボードのGND部分と接続 

次にOPアンプ。
[下段(左から)]
 2番目ーINPUT:3番目から1KΩ抵抗と接続
         4番目と接続
 3番目+INPUT:音声LSIの下段12番目を参照
 4番目GND:ブレッドボードのGNDと接続
[上段(左から)]
 3番目Vcc:ブレッドボードの3.3Vと接続
 4番目OUTPUT:47uF電解コンデンサを経由して空いてる場所へ接続
         その空いている場所からスピーカへ
         加えて100pFコンデンサを空いている場所へ接続
 *スピーカの、もう片方はGNDと接続してください。
ーーーーーーーーーーーーーーーーーーーーーーーーーーー
こんな感じです。。。ちょっと複雑ですね。

これで回路部分は完成したので、次回はプログラム部分を紹介してきまーす

電子回路部分作成1 (1-5.回路:モータ、スイッチ) [ロボット制作(tankun-mk1)]

おはようございます。
試験終わった~受かるといいなぁ。

さて、更新を完全に怠っていましたが今日から再開です[exclamation×2]

今日からロボット作成として電子回路部分を作成していきます。
まず先に完成後の回路はこちら
P1060187.jpg

普段は赤い線(Vcc)黒い線(GND)の部分がブレッドボードの
上下それぞれにあったと思いますが、今回は写真の通り
VccとGNDが片方にしかないタイプを使用します。

また、Vccの部分ですが左と右でわかれているので、
異なる電圧を接続可能となっており、
今回はArduinoから左側に3.3V、右側に5.0Vを接続します。

補足として、a-fの部分が電気的に繋がっていてg-lの部分が繋がっています。
つまりa-fとg-l部分は繋がっていないので別のハードを並べられます。

いきなり全部は難しいので今回は
モーター部分スイッチ部分からいきますね

まずはモーター部分
P1060361.jpg

左右のキャタピラを別々に制御するのでドライバICを2つ以下で使用します。
ポイントは両ドライバICでVcc,GND部分など電源に関わる部分は
共通化してもまとめても問題ないのでお互いを接続しています。

[上段ドライバIC]
 1,2番ピン:Arduinoの6,7番ピンと接続します
 3,5番ピン:0.01pFのコンデンサで接続します
 4,6,7番ピン:下段ドライバICの4,6,7番ピンと接続します

[下段ドライバIC]
 1,2番ピン:Arduinoの8,9番ピンと接続します
 3,5番ピン:0.01pFのコンデンサで接続します
 4番ピン:ブレッドボードのGND部分と接続します(黒線の部分)
 6番ピン:0.1pFでブレッドボードのGND部分と接続します
 7番ピン:ブレッドボードのVcc部分と接続します(赤線の部分)

続けてスイッチ部分
P1060362_2.jpg

写真を参考にボタンをそれぞれVcc,GND(10KΩ経由)に接続します。
また写真の赤枠部分にArduinoのピンと接続します。
青ボタンをArduinoの4番ピン、赤ボタンを5番ピンにします。

今日はここまでです[るんるん]次回は音声部分をやろうかな。

センサー部分作成 (1-4.サーボ、センサー編) [ロボット制作(tankun-mk1)]

おはようございます。外は星が綺麗ですよぉ~[満月]

今日はサーボ、センサーを取り付けて行きたいと思います。アマゾンさんで購入した「超音波距離センサー + アクリル マウント アングル + サーボモーター」です。
設置する目的は以下を行うためです

1)正面に壁を見つけたら停止する
壁を見つけるために超音波センサーというパーツで前方に物体があるかを検知します。超音波センサーは超音波を前方に発信し、その反射波を受信して対象物までの距離を検出するものです。

2)右と左を確認して障害物がない方向を見つける
この右、左を確認するためには超音波センサーを右と左に回転させる必要があります。この回転を行うのがサーボモーターです。サーボモーターは上に載せた物を「90°、120°、60°」と指定した角度に回転させる事ができます。

(超音波センサー、サーボモーターの動作、配線に関しては別記事に書きますね)

先に完成図がこちら[exclamation×2]ロボットに顔っぽい物がつきました[グッド(上向き矢印)]
P1060160.JPG

下に見える青い箱がサーボモーターです。
上に見える目みたいなものが超音波センサーです。
超音波センサーとサーボモーターをつないでいるのが、
アクリルマウントアングルです。これはプラ板・棒などで自作も可能ですが、
3点セットで1000円前後と超音波センサー(300円)とサーボモーター(450円)を
それぞれ購入した時と値段がほとんど変わりません[るんるん]

それでは設置方法です。

まずは写真を参考にロボットの先端部分をカットしてみます。
設置するサーボは左右非対称のパーツなので、切り取る部分も少しずらしています。
P1060149.JPG

そこにサーボモーターを設置します。
P1060150.JPG

センサーとアクリルマウントを設置したのがこちら[ぴかぴか(新しい)]
P1060151.JPG

センサーとアクリルマウントを先に作ります。
白い十字架みたいなものがサーボホーンといって、サーボモーターに付属しているパーツです。

アクリルマウントの穴の部分に上からサーボホーンをはめて、
それをサーボモーターに設置すれば完成です[exclamation×2]

次回からはArduinoに各パーツを制御する方法を個別に書いていきまーす。

足回り作成2 (1-3.ロボット制作) [ロボット制作(tankun-mk1)]

はい、連チャンで~す[exclamation×2]
ちょっと会社に行く時間が迫って来た…急がねば。

次はモーターです。TAMIYAさんのダブルギアボックス。
P1060062.jpg

これの凄いところは
1)モーターが2つなので左右それぞれに制御できる
2)ギアの組み合わせでトルク速度・トルクが4段階に変更可能

1)ですがロボットを旋回させる場合には必須となります。右に移動する場合は「左のキャタピラを前進」「右を後退」みたいな。
2)に関してはモーターギアの仕組みとして速度を早くするとトルク(パワー)が落ちて、速度を遅くするとパワーが上がるといった感じです。速度を早くし過ぎると制御が難しくなるので今回は、一番低速でハイパワーの344.2:1で行きます。

作りました~(作り方は説明書を見てね)
P1060068.jpg

手前の謎の棒ですが、本体とモーターを固定するために使用します。こんな感じ[目]
P1060070.jpg

そしてモーターを本体に取り付けて、キャタピラを装着したのがこちら[exclamation×2]
P1060148.jpg
P1060145.jpg

なんか動きそうな雰囲気がでてきましたねこれで足回りは一旦、完成です。
次回からはArduinoを使用した電子工作部分をやっていきたいと思いま~す。

では家族を起こして、子供を保育所に送って、会社に行ってきま~す[わーい(嬉しい顔)]
皆さんもいい一日を~[手(パー)]

足回り作成1 (1-2.ロボット制作) [ロボット制作(tankun-mk1)]

遅くなりましたぁー[どんっ(衝撃)]
Chihiroは超朝活人間で9:30に寝て、4:30頃に起きています。。。お爺ちゃん[あせあせ(飛び散る汗)]

色々と届いたので順番に制作していきたいと思います。
まずは足回り[exclamation×2]土台をベースにキャタピラ・モーター部分を作っていきます。

届いた商品がこちら。TAMIYAさんのキャタピラとユニバーサルプレートです。
IMG_20151202_061125.jpg

キャタピラの中身はこんな感じ。車輪は大小さまざまな物がはいっています。
キャタピラも長さが大・中・小とあって、つなげることで色んな長さが作れます。
IMG_20151202_062731.jpg

ユニバーサルプレートは長方形型の板で、中には等間隔の穴が開いています。
そして車輌をつけるための専用パーツがいくつか付属しています。
P1060061.jpg

今回の制作結果がこちら
ユニバーサルプレートにキャタピラの車輪を装着させました。
各パーツをつなげているオレンジ色の物体は付属していてる
プッシュピンというパーツです。
P1060139.jpg

P1060143.jpg

小さな車輪を支えている長細いパーツはユニバーサルプレートの先頭から6個目の穴が先頭になるよう1本目をつけ、繋げる形で2本目を装着してください。
そうすると2本目は3個ほど穴が先頭からはみ出てると思うので、
そこに写真のように車輪をとりつければ完成です[exclamation×2]

今回はここまで~[手(パー)]
次回はモーターを作って、キャタピラを装着させたいと思います。


まずはお買い物編 (1-1.ロボット制作) [ロボット制作(tankun-mk1)]

それではロボット制作…の前にまずは必要な部品を購入したいと思います。
まず作るロボットですがtankun-mk1として以下の仕様としたいと思います。

 1) キャタピラ式:いきなり2足歩行などの足は難しいので、まずはキャタピラから
 2) 自走ロボット:壁などの障害物を検知して、止まって自動で行き先を探します
 3) 喋ります  :なくてもいいんです…でも喋った方が素敵じゃないですか[るんるん]
 4) 安く仕上げる:今回は7500円以内での完成を目指します

お買い物は全て通販でAmazonさんと秋月電子さんを使い分けていきます。
理由は物が揃っていて、安いこと!!
僕は田舎に住んでいるのでこれだけを一気に変える場所がないんですよ[たらーっ(汗)]そして見つけたとしても、こんなに安くは買えませんからねぇ。

Amazonで以下を購入
 1) TAMIYA キャタピラ(468円)
 2) TAMIYA ユニバーサルプレート(648円)
 3) TAMIYA ツインモーター(654円)
 4) テスター(420円) ... 買わなくてもいいです
 5) Arduino本体(1850円)
 合計:4040円

次に秋月電子さんで以下を購入しました~[わーい(嬉しい顔)]
  1)音声合成LSI ATP3011M6-PU(850円
  2)オーディオアンプ NJM386BD(100円
  3)コンデンサ各種(200円前後
  4)抵抗各種(300円前後
  5)モータドライバIC TA7267BP(300円
  6)電池ボックス(単3*4本) (060円
  7)スピーカー(100円
  8)タクトスイッチ(水色、赤色)(020円
  9)ブレッドボード(270円
 10)ジャンパーコード(オス-オス)(220円
 11)ジャンパーコード(オス-メス)(330円
 12)ジャンパーワイヤー(400円)
 13) バッテリースナップ(20円)
 14)単9電池(100円)
 15)単3電池4本(80円)
 合計 3350円

加えて100円均一で以下を買います
 1)ニッパー
 2)両面テープ
 3)マジックテープ
 4)ドライバーセット
 合計 432円

 

あれ少しオーバーしている[がく~(落胆した顔)]
まぁテスターはなくても作れる事を考えてOKとしましょう[手(チョキ)]

商品詳細は物が届いたら順番に写真付きで紹介しまーす[猫]
そして申し訳ありませんが作っているうちに必要な物がでてくると
購入リストは適宜更新します。。。

ロボット制作(tankun-mk1) ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。