surga Lab

読者です 読者をやめる 読者になる 読者になる

surga Lab

営業部でも開発したい!!

Arduinoで自立走行車の自動停止を実装してみました

前回でモータ制御だけ可能な自立走行車ができました。

blog.hisurga.com

しかしこれだけでは事前に与えられたルートでしか制御を行うことができません。
そこで今回は距離センサのシールドを作成し、障害物で自動停止する機能を実装できました。

f:id:hisurga:20170225212247j:plain

必要なもの

  • バニラシールド

Arduino用バニラシールド基板ver.2(白)

Arduino用バニラシールド基板ver.2(白)

  • 配線やピンなど

  • 過去記事の製作物

blog.hisurga.com

blog.hisurga.com

また、シャーシの連携性が悪かったためにタミヤのユニバーサルプレートを追加購入しています。
初めからタミヤのキットを買っておけばよかったと後悔してます。

タミヤ 楽しい工作シリーズ No.157 ユニバーサルプレート 2枚セット (70157)

タミヤ 楽しい工作シリーズ No.157 ユニバーサルプレート 2枚セット (70157)

配線

基本的には過去記事で作成したものをそのままシールドに移すだけですが、モータドライバとの組み合わせの関係で使用ピンを若干変更しました。

部品量が少ないからと事前に検討せず適当に半田付けしていったら、裏がひどいことになりましたね。

f:id:hisurga:20170225212249j:plain

f:id:hisurga:20170225212250j:plain

ブレッドボードにするとこんな感じです。

f:id:hisurga:20170228211524p:plain:w400

コード

シールドが2枚になったことでコードが若干長くなってしまいましたが、難しく考える必要はなく、ブレッドボード時のコードをほぼそのまま流用できます。

とりあえず今回はシンプルに障害物で止まるコードを試します。

動画で見ると速度変化がわかると思います。

完成

できたシールドを上に乗っけるだけです。
だいぶいい感じになりましたね。

f:id:hisurga:20170225212248j:plain

実際に動かした動画がこちらです。

Arduinoでシールドを自作してみました

前回はブレッドボードでモータ制御を実装することができました。

blog.hisurga.com

そのまま車体に乗っけてもいいのですが、利便性と安定性を考えてシールド化しました。

f:id:hisurga:20170214215509j:plain

必要なもの

  • バニラシールド

Arduino用バニラシールド基板ver.2(黒)

Arduino用バニラシールド基板ver.2(黒)

  • 配線やソケットなど

配線

ブレッドボードではジャンパ線を利用して自由度の高い配線ができましたが、自作シールドではそうもいきません。
交差しないようにとか、近くに集まりすぎないようにとか、いろいろ考慮が必要です。
そのため、紙などで一旦配置を考えることをお勧めします。

私はなんだかんだ"交差ありで偏りすぎなシールド"になってしまいましたけど。 f:id:hisurga:20170214215507j:plain f:id:hisurga:20170214215508j:plain

写真で見ると分かるかと思いますが、いくつかブレッドボード版から改良しています。
まずArduinoへの電源供給をするかしないか選択できるスイッチを追加し、さらにモータと電源の接続をEIコネクタにすることで再利用性を高めました。
ブレッドボード図にすると以下のようになります。

f:id:hisurga:20170216231217p:plain:w400

また配線の都合上、使用するデジタルピンの位置も変更しました。

//defineを以下に変更
#define MODE 7
#define APHASE 6
#define AENBL 5
#define BPHASE 4
#define BENBL 3

完成

Arduinoに電源供給するとエネループ電池x4では足りなかったため、9V電池を利用しています。今後はその辺も計算しないといけませんね。

f:id:hisurga:20170214215510j:plain

とりあえず仮載せです。
見た目がスッキリしましたね。

f:id:hisurga:20170214215511j:plain

前進→後進→回転→急停止の動画です。
実際に動くと、成果が目に見えるので嬉しいですね。動画はブレブレですが。

Arduinoでモータドライバを使ってみました

大きく動くものが作りたいということで、自立走行車を作りました。
とりあえず今回はモータの制御だけです。

f:id:hisurga:20170202221657j:plain

必要なもの

シャーシ作成

Amazonのレビューが若干怪しいシャーシですが、値段の割にしっかりしてました。
シンプルなのでサクッと組み上げましょう。 f:id:hisurga:20161022193438j:plain f:id:hisurga:20170202230329j:plain

回路

DRV8835の仕様は以下販売サイトの説明がわかりやすいと思います。
Pololu - DRV8835 Dual Motor Driver Carrier

今回はシンプルに制御したかったので、MODEにHIGHを入力しました。

xPHASE xENABLE xOUT1 xOUT2 処理
0 PWM PWM L 前進PWM%/ブレーキ
1 PWM L PWM 後進PWM%/ブレーキ
x 0 L L ショートブレーキ

それを元に回路を組みます。
fritzingにモータドライバのパーツがなかったので、それっぽいもので代用しました。
電源をArduinoのVinに繋げることでモータとArduinoの電源をまとめることができます。(許容電圧には気をつけて下さい)

f:id:hisurga:20170206222827p:plain:w400

コード

ストップアンドゴー

#define MODE 7
#define APHASE 8
#define AENBL 9
#define BPHASE 10
#define BENBL 11

void setup()
{
  pinMode(MODE, OUTPUT);
  pinMode(APHASE, OUTPUT);
  pinMode(AENBL, OUTPUT);
  pinMode(BPHASE, OUTPUT);
  pinMode(BENBL, OUTPUT);
  digitalWrite(MODE, HIGH);
}

void loop()
{
  digitalWrite(APHASE, LOW);
  analogWrite(AENBL, 50);

  delay(2000);
  
  digitalWrite(APHASE, LOW);
  digitalWrite(AENBL, LOW);
  
  digitalWrite(BPHASE, LOW);
  analogWrite(BENBL, 255);

  delay(2000);
  
  digitalWrite(BPHASE, LOW);
  digitalWrite(BENBL, LOW);
}

基本的にPololu - DRV8835 Dual Motor Driver Carrierの仕様に従えば動きます。
速度は"analogWrite"で決定します。

実際に動かした動画がこちらです。
騒音注意です。

徐々に速度変化

#define MODE 7
#define APHASE 8
#define AENBL 9
#define BPHASE 10
#define BENBL 11

void setup()
{
  pinMode(MODE, OUTPUT);
  pinMode(APHASE, OUTPUT);
  pinMode(AENBL, OUTPUT);
  pinMode(BPHASE, OUTPUT);
  pinMode(BENBL, OUTPUT);
  digitalWrite(MODE, HIGH);
}

void loop()
{
  for(int i = 50; i < 255; i++)
    {
      digitalWrite(APHASE, LOW);
      analogWrite(AENBL, i);
      digitalWrite(BPHASE, LOW);
      analogWrite(BENBL, i);
      delay(100);
    }
  delay(2000);
    for(int i = 255; i > 50; i--)
    {
      digitalWrite(APHASE, LOW);
      analogWrite(AENBL, i);
      digitalWrite(BPHASE, LOW);
      analogWrite(BENBL, i);
      delay(100);
    }
    delay(2000);
}

すごい音です。
モータの許容電圧7Vに対して9V掛けているからかも。

完成

とりあえずタイヤの制御部を完成させることができました。
次回はこれらをシールド化してシャーシに載せます。

f:id:hisurga:20170206230345j:plain

営業だけど応用情報に合格してみました

2016年秋季の試験にて、応用情報処理技術者試験に一発合格することができました。
勉強法などを参考にしていただけたら幸いです。

f:id:hisurga:20170112232007p:plain:w300

なぜ受けたのか/メリット

“情報技術についてはある程度知っているよ” と示せる

応用情報技術者試験の対象者は

高度IT人材となるために必要な応用的知識・技能をもち、高度IT人材としての方向性を確立した者

となっています。
つまり合格すれば、国が「この人は高度IT人材としての方向性を確立したものだ!」と証明してくれるようなものです。
もちろん実務経験までは証明してくれませんが、、、

知識の幅が広がる

ITといってもたくさんの意味を含みます。
アルゴリズム、ソフト、ハード、セキュリティ、マネジメント、法務、、、

応用情報はそれらほぼ全ての分野から出題されます。広いです。
試験に合格するための勉強を行うだけでも、幅広い知識を得ることができます。

会社から金一封もらえるから

ちょっとしたボーナス。
これが主な目的かもしれない。

勉強時間

午前対策

1ヶ月弱前~1週間前

仕事帰りに喫茶店で2-3時間ほど参考書で勉強しました。
その際ペンをほとんど使わず、計算問題も解法だけ答え合わせを行い、解説が少ない用語を見つけたら理解するまでスマホで確認という形式をとりました。
そうすることでいいペースで参考書を進めることができたと思います。
土日は平日勉強したとき苦手と感じた分野の復習を行いました。

その際使用した参考書はこちらです。

徹底攻略 応用情報技術者教科書 平成27年度 (Tettei Kouryaku JOHO SHORI)

徹底攻略 応用情報技術者教科書 平成27年度 (Tettei Kouryaku JOHO SHORI)

  • 作者: 株式会社わくわくスタディワールド瀬戸美月
  • 出版社/メーカー: インプレス
  • 発売日: 2014/12/04
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログを見る

数年ぐらい誤差ですし、抵抗がなければ中古品でも十分だと思います。

なお私はすでに基本情報を取得しているため、いきなり応用情報から受ける場合はもう少し余裕を持ったスケジュールにすべきかと思います。

1週間前

午前問題は過去問から出題されていることが多いため、ネットの過去問集サイトを利用してひたすら過去問を解きました。

応用情報技術者過去問道場|応用情報技術者試験.com

これだけでかなり安定して点を取れるようになったと思います。

午後対策

2~3日前になんとなく過去問を眺め、当日選ぶ問題を考えていました。
正直午前が不安で午後に時間を割けられなかったからです。

とはいっても、午前問題さえ解ける力を持っていれば午後問題の多くは"国語"に変化します。
問題文をよく読めばわかることが多いです。

また、プログラミングを少しでも触ったことがあればプログラミングの問題はおすすめです。
比較的安定して点が取れます。

(私の得点はかなりぎりぎりでしたが)

感想

メリットにも書きましたが、知識の幅が広がったことが一番嬉しいです。
今までなんとなくで理解していたものを正しい知識で修正することで、ITに関してより興味が湧き、さらには自信にもつながりました。

ちなみに応用情報技術者試験に合格すると、2年間は高度情報処理技術者試験の午前Iが免除されます。
せっかくなので、ここで満足せずに情報処理試験の高みを目指すつもりです。

Arduinoで超音波式メジャーを作ってみました

以前試した超音波距離センサと7セグを利用して簡易超音波式メジャーを作成しました。

f:id:hisurga:20161130233251j:plain

hisurga.hatenablog.com

hisurga.hatenablog.com

基本的に組み合わせるだけですので、追加の部品などは不要です。

回路

隣に繋げるだけです。

f:id:hisurga:20170222191624p:plain:w400

コード

#include<SPI.h>

#define ECHO 6
#define TRIG 7

#define SCK 13
#define LATCH 10
#define SDI 11

const byte digits[] =
  {
    0b11111100, // 0
    0b01100000, // 1
    0b11011010, // 2
    0b11110010, // 3
    0b01100110, // 4
    0b10110110, // 5
    0b10111110, // 6
    0b11100000, // 7
    0b11111110, // 8
    0b11110110, // 9
  };

void setup()
{
  //hc-sr04
  pinMode(ECHO, INPUT);
  pinMode(TRIG, OUTPUT);
  Serial.begin( 9600 );
  //7seg
  pinMode(LATCH,INPUT);
  pinMode(SCK, OUTPUT);
  pinMode(SDI, OUTPUT);
  SPI.begin();
  SPI.setBitOrder(LSBFIRST);
  SPI.setDataMode(0);
}

void loop()
{
  double Interval = 0;
  double Distance = 0;
 
  digitalWrite(TRIG, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG, LOW);
  Interval = pulseIn(ECHO, HIGH);

  if (Interval != 0)
  {
    Interval = Interval / 2;
    Distance = Interval * 340 * 0.0001;
    Serial.print(Distance);
    Serial.println("cm");
  }
  
  //7seg  
  int d_seg = 0;
  if(Distance < 10.0)
    {
      d_seg = 0;
    }
  else if(90.0 < Distance)
    {
      d_seg = 9;
    }
  else
    {
      d_seg = Distance / 10;
    }

  digitalWrite(LATCH, 0);
  SPI.transfer (digits[d_seg]);
  digitalWrite(LATCH, 1);

  delay(500);
}

7セグが表示する値

1桁しか表示できないので、一定の範囲で変動するようにしました。
測定距離 < 10cm
0表示

90cm < 測定距離
9表示

それ以外
10の位の値のみ表示

完成

10cm未満

f:id:hisurga:20161130233255j:plain

15cmくらい

f:id:hisurga:20161130233301j:plain

30cmくらい

f:id:hisurga:20161130233305j:plain

今回はソフト面の変更が多かったですね。
それっぽい機能を実装できました。