[Arduino]初めてのロボットを作ろう

意欲的な金融マンがゼロから銀行を作りたいと思うのと同様、エンジニアであれば自分で独自のOS、プログラミング言語(コンパイラ)、CPU、ロボットを作りたいと思うだろう。

ロボットというとガンダムのモビルスーツのイメージが先行してしまうのだが、ブログでPMCをやるなんて宣言するのは問題がありすぎる。
一つの目標値として産業用ロボットがあるが、その他にも例えば家電量販店で陳列されている商品群はロボットとは言えないかもしれないがマイコンで制御されている商品が殆どである。したがって、どの分野を取り組むかは慎重に考える必要がある。

とは言え、最初は簡単なところから始めるのが鉄則。ということで、ブレッドボードを使って簡単なロボットを作りたい。

– LEDで「目」を光らせる
– スピーカーを「口」の機能とする
– temperature sensorを「鼻」と見立てて温度を測り、それによってスピーカーを制御する
– 「足」の機能としてDCモーター機能を付ける

イメージを配置

dav

続いて、目のLED部分の実装

dav

そして、口となるスピーカーの実装
これでドレミと喋るようになります。

void setup() {
  pinMode(13, OUTPUT);
}

void loop() {
  digitalWrite(13, HIGH);
  tone(10, 262, 200);
  delay(1000);
  tone(10, 294, 200);
  delay(1000);
  tone(10, 330, 200);
  delay(1000);
}
dav

続いて「鼻」にあたる気温センサーの実装
25℃以上なら、喋るようにします。
温度センサーはosoyoのモジュールを使います。
https://osoyoo.com/ja/2015/03/11/ds18s20-temperature-sensor-module/

#include <OneWire.h>
int inPin = 7;
OneWire ds(inPin);

void setup() {
  Serial.begin(9600);
  pinMode(13, OUTPUT);
}

void loop() {
  int HighByte, LowByte, TReading, SignBit, Tc_100, Whole, Fract;
  byte i;
  byte present = 0;
  byte data[12];
  byte addr[8];

  if(!ds.search(addr)){
    ds.reset_search();
    return;
  }

  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);
  
  
  delay(1000);

  present = ds.reset();
  ds.select(addr);
  ds.write(0xBE);

  for(i = 0; i < 9; i++){
    data&#91;i&#93; = ds.read();
  }
  Serial.print("Temperature:");
  LowByte = data&#91;0&#93;;
  HighByte = data&#91;1&#93;;
  TReading = (HighByte << 8) + LowByte;
  SignBit = TReading & 0x8000;
  if(SignBit){
    TReading = (TReading ^ 0xffff) + 1;
  }
  Tc_100 = (6 * TReading) + TReading / 4;
  Whole = Tc_100 / 100;
  Fract = Tc_100 % 100;
  if(SignBit){
    Serial.print("-");
  }
  Serial.print(Whole);
  Serial.print(".");
  if(Fract < 10){
    Serial.print("0");
  }
  Serial.print(Fract);
  Serial.print(" C\n");

  digitalWrite(13, HIGH);
  
  if(Whole > 26){
    tone(10, 262, 200);
    delay(1000);
    tone(10, 294, 200);
    delay(1000);
    tone(10, 330, 200);
    delay(1000);  
  }
}
dav

そして最後に「足」として、DCモータを3.3v -> GRDで付けます。

dav

おおお、一応、動いている^^
モーターを使った駆動系の処理は力学、電気学など勉強が必要そうだが、色々できそうなことはわかった。

[Arduino]土壌湿度検出モジュール

ポトスという観葉植物を購入して、土壌湿度を検証します。

void setup() {
  Serial.begin(9600);
  pinMode(3, INPUT);
  pinMode(13, OUTPUT);
}

void loop() {
  int val, val_old;
  val = digitalRead(3);
  digitalWrite(13, val);
  val_old = 1023-analogRead(0);
  Serial.print("Moisture Sensor Value:");
  Serial.println(map(val_old, 0, 1023, 0, 100));
  delay(100);
}

dav

シリアルモニター
Moisture Sensor Value:31
Moisture Sensor Value:30
Moisture Sensor Value:30
Moisture Sensor Value:30
Moisture Sensor Value:31

コレを作ると、農作物の温度、湿度管理のイメージが大分沸きます。

[Arduino]可燃ガス/煙センサー

煙、ガスを検出し、serial monitorに濃度値を表示する。

void setup() {
  Serial.begin(9600);
}

void loop() {
  int val;
  val = analogRead(0);
  Serial.println(val,DEC);
  delay(100);
}

dav

土壌モジュールを除いて、一通り基礎は終わりました。

[Arduino]火炎検知センサー

火炎検知センサーは、読んで字のごとく火炎を検出する。

### ソースコード
// 省略

dav

何やコレ、ターボライターは反応しない。
室内で実験に火を使用するのは万一を考えると危険だ。

[Arduino]リードスイッチ

リードスイッチモジュールは磁場を検出する
マグネットを購入し、リードスイッチに近づけて、LEDの点灯を制御する

int Led = 13;
int buttonpin = 3;
int val;

void setup() {
  pinMode(Led, OUTPUT);
  pinMode(buttonpin, INPUT);
}

void loop() {
  val = digitalRead(buttonpin);
  if(val==HIGH){
    digitalWrite(Led, HIGH);
  } else {
    digitalWrite(Led, LOW);
  }
}

dav

マグネットは水銀に比べて身体に安全という利点がありそうだ

[Arduino]水銀チルトセンサー

水銀チルトセンサーはチルト(tilt)を測定する
水銀チルトセンサーの斜度を変えて、LEDは点灯や消灯する
チルトとは傾斜

int Led = 13;
int buttonpin = 3;
int val;

void setup() {
  pinMode(Led, OUTPUT);
  pinMode(buttonpin, INPUT);
}

void loop() {
  val = digitalRead(buttonpin);
  if(val==HIGH){
    digitalWrite(Led, HIGH);
  } else {
    digitalWrite(Led, LOW);
  }
}

mde

傾斜が変わるって何だろう? 地震は揺れだし、単にオンオフの切り替えならばスイッチで良いし。
かつてはガスファンヒーター・石油ヒーターなどの転倒防止スイッチで使用されていたらしい。
水銀が危険なので現在は使われていないとのこと。センサー一つで歴史を感じる。

[Arduino]遮光センサー

遮光センサーはフォトインタラプタを検出できる。

フォトインタラプタとは?
>発光素子と受光素子を1つのパッケージに対向して並べ、その間を検出物体が光をさえぎることにより、検出機能を持つ

int Led = 13;
int val;

void setup() {
  pinMode(Led, OUTPUT);
  pinMode(3, INPUT);
}

void loop() {
  val = digitalRead(3);
  if(val==HIGH){
    digitalWrite(Led, HIGH);
  } else {
    digitalWrite(Led, LOW);
  }
}

mde

コレはびっくりする。
物体検知という意味では赤外線センサーなどと一緒なのかもしれないが、原理が全く異なるのね。