Fritzingをローカルにダウンロードします。
https://fritzing.org/download/
配線をオンライン上で描いていきます。

おお、これは素晴らしい。
ソフトウェアエンジニアの技術ブログ:Software engineer tech blog
随机应变 ABCD: Always Be Coding and … : хороший
SourceForge.netというサイトに行きます。
https://sourceforge.net/projects/webiopi/files/
WebIOPi-0.7.1.tar.gzをダウンロードします。
# tar xvzf WebIOPi-0.7.1.tar.gz
# cd WebIOPi-0.7.1
# sudo ./setup.sh
# sudo /etc/init.d/webiopi start
[ ok ] Starting webiopi (via systemctl): webiopi.service.
# ip a
http://192.168.100.108:8000/
ユーザ名 webiopi パスワード raspberry
192.168.100.108 により途中で接続が切断されました。
ERR_CONTENT_LENGTH_MISMATCH
ん? 何故だ?
ztc00 超小型ビデオカメラをUSBに接続します。
# lsusb
Bus 001 Device 004: ID 1bcf:0005 Sunplus Innovation Technology Inc. Optical Mouse
Bus 001 Device 027: ID 05e1:0b01 Syntek Semiconductor Co., Ltd
Bus 001 Device 005: ID 413c:2107 Dell Computer Corp.
Bus 001 Device 006: ID 0424:7800 Standard Microsystems Corp.
Bus 001 Device 003: ID 0424:2514 Standard Microsystems Corp. USB 2.0 Hub
Bus 001 Device 002: ID 0424:2514 Standard Microsystems Corp. USB 2.0 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
# sudo apt-get -y install fswebcam subversion libjpeg8-dev imagemagick
# svn co https://svn.code.sf.net/p/mjpg-streamer/code/mjpg-streamer mjpg-streamer
# cd mjpg-streamer; make
# sudo fswebcam sample.jpg
— Opening /dev/video0…
stat: No such file or directory

あれ、認識してない、何でだろう??
ただ、ラズパイでビデオ、カメラ接続が容易にできることがわかった。
シェルで条件に合致したときにfswebcam sample.jpgを打ち込めばいいわけだ。
ほぼイメージができてきた。
#!/bin/sh
gpio_number=25
echo "${gpio_number}" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio${gpio_number}/direction
echo "1" > /sys/class/gpio/gpio${gpio_number}/value
sleep 5
echo "0" > /sys/class/gpio/gpio${gpio_number}/value
echo "${gpio_number}" /sys/class/gpio/unexport
root@raspberrypi:/home/pi# sudo sh led.sh
25 /sys/class/gpio/unexport
期待通りに動きます。
ターミナル
pi@raspberrypi:~ $ sudo -s
root@raspberrypi:/home/pi# echo “14” > /sys/class/gpio/export
root@raspberrypi:/home/pi# echo “out” > /sys/class/gpio/gpio14/direction
root@raspberrypi:/home/pi# echo “1” > /sys/class/gpio/gpio14/value
root@raspberrypi:/home/pi# echo “0” > /sys/class/gpio/gpio14/value

続いて、shを使ってLチカ
#!/bin/sh echo "14" > /sys/class/gpio/export echo "14" > /sys/class/gpio/export while true do echo "1" > /sys/class/gpio/gpio14/value sleep 0.5 echo "0" > /sys/class/gpio/gpio14/value sleep 0.5 done
root@raspberrypi:/home/pi# chmod +x led.sh
root@raspberrypi:/home/pi# sudo ./led.sh
なるほど、ラズパイはgpioを/sys/class/gpio/*で操作するのか
Lチカの環境構築はarduinoよりもハードル高いように感じるけど、コマンドラインで操作できると何故か安心感あるな
意欲的な金融マンがゼロから銀行を作りたいと思うのと同様、エンジニアであれば自分で独自の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で付けます。

おおお、一応、動いている^^
モーターを使った駆動系の処理は力学、電気学など勉強が必要そうだが、色々できそうなことはわかった。
各社産業用ロボット
ファナック
https://www.fanuc.co.jp/
川崎重工業
https://www.khi.co.jp/
安川電機
https://www.yaskawa.co.jp/
### メモ
– 産業用ロボット大手はABB、ファナック、川崎重工業、安川電機、KUKAでアーム型が殆ど
– ロボットに機械学習を実装するのは当たり前になっている
– 赤外線、音声出力、撮影、家電操作、音声認識、顔認識、巡回機能、ARなど多様な機能を組み込んでいる
– 二足歩行ロボットはZMPなど歩行制御のアルゴリズムがある
– 足は電動モータなどのアクチュエーターで動かしている。更に脚部にバネを入れるなどして動作安定化という課題も克服しなければならない。
歩行ロボットはかなり難しそうか。。。
ポトスという観葉植物を購入して、土壌湿度を検証します。
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);
}


土壌モジュールを除いて、一通り基礎は終わりました。
赤外線センサーが障害物を検知する。
### ソースコード
// 省略
### 配線
// 省略

何度やってもセンサーが動作しない。原因不明。