Fritzingをローカルにダウンロードします。
https://fritzing.org/download/
配線をオンライン上で描いていきます。
おお、これは素晴らしい。
ソフトウェアエンジニアの技術ブログ:Software engineer tech blog
随机应变 ABCD: Always Be Coding and … : хороший
意欲的な金融マンがゼロから銀行を作りたいと思うのと同様、エンジニアであれば自分で独自のOS、プログラミング言語(コンパイラ)、CPU、ロボットを作りたいと思うだろう。
ロボットというとガンダムのモビルスーツのイメージが先行してしまうのだが、ブログでPMCをやるなんて宣言するのは問題がありすぎる。
一つの目標値として産業用ロボットがあるが、その他にも例えば家電量販店で陳列されている商品群はロボットとは言えないかもしれないがマイコンで制御されている商品が殆どである。したがって、どの分野を取り組むかは慎重に考える必要がある。
とは言え、最初は簡単なところから始めるのが鉄則。ということで、ブレッドボードを使って簡単なロボットを作りたい。
– LEDで「目」を光らせる
– スピーカーを「口」の機能とする
– temperature sensorを「鼻」と見立てて温度を測り、それによってスピーカーを制御する
– 「足」の機能としてDCモーター機能を付ける
イメージを配置
続いて、目のLED部分の実装
そして、口となるスピーカーの実装
これでドレミと喋るようになります。
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); }
続いて「鼻」にあたる気温センサーの実装
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[i] = ds.read(); } Serial.print("Temperature:"); LowByte = data[0]; HighByte = data[1]; 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); } }
そして最後に「足」として、DCモータを3.3v -> GRDで付けます。
おおお、一応、動いている^^
モーターを使った駆動系の処理は力学、電気学など勉強が必要そうだが、色々できそうなことはわかった。
ポトスという観葉植物を購入して、土壌湿度を検証します。
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); }
シリアルモニター
Moisture Sensor Value:31
Moisture Sensor Value:30
Moisture Sensor Value:30
Moisture Sensor Value:30
Moisture Sensor Value:31
…
コレを作ると、農作物の温度、湿度管理のイメージが大分沸きます。
煙、ガスを検出し、serial monitorに濃度値を表示する。
void setup() { Serial.begin(9600); } void loop() { int val; val = analogRead(0); Serial.println(val,DEC); delay(100); }
土壌モジュールを除いて、一通り基礎は終わりました。
赤外線センサーが障害物を検知する。
### ソースコード
// 省略
### 配線
// 省略
何度やってもセンサーが動作しない。原因不明。
火炎検知センサーは、読んで字のごとく火炎を検出する。
### ソースコード
// 省略
何やコレ、ターボライターは反応しない。
室内で実験に火を使用するのは万一を考えると危険だ。
リードスイッチモジュールは磁場を検出する
マグネットを購入し、リードスイッチに近づけて、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); } }
マグネットは水銀に比べて身体に安全という利点がありそうだ
水銀チルトセンサーはチルト(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); } }
傾斜が変わるって何だろう? 地震は揺れだし、単にオンオフの切り替えならばスイッチで良いし。
かつてはガスファンヒーター・石油ヒーターなどの転倒防止スイッチで使用されていたらしい。
水銀が危険なので現在は使われていないとのこと。センサー一つで歴史を感じる。
遮光センサーはフォトインタラプタを検出できる。
フォトインタラプタとは?
>発光素子と受光素子を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); } }
コレはびっくりする。
物体検知という意味では赤外線センサーなどと一緒なのかもしれないが、原理が全く異なるのね。
char val; void setup() { Serial.begin(9600); pinMode(13, OUTPUT); } void loop() { val = Serial.read(); if(val=='1'){ digitalWrite(13, HIGH); } if(val=='0'){ digitalWrite(13, LOW); } }