どうも18日目担当の@Tea_K-M-Rです。
今回、Raspberry Pi Zero Wを触ってみました。他の方の記事と比べると劣っていますが温かい目で見てください笑
それではいってみよー!
#そもそもRaspberryPiとは??
https://www.sejuku.net/blog/48510
すみません、これ読んでください笑
#使用したもの
RasberryPizero×1
人感センサー×1
距離センサー×1
カメラ×1(自分はLogicoolを使用しました)
ブレッドボード×1
ジャンパワイヤ 複数
#やったこと
今回、やったのは人感センサーで物体を感知したら、距離センサーでその物体との距離を測り「"Someone is there"」と表示させカメラを撮るというものです。
#セットアップ
自分はセットアップする際、「写真や図解でよくわかる ラズパイZeroを使い倒す本」という本を参考にしました。
リモートのやり方も載っています。(レス遅いのでやらなくても良い気がします)
本じゃなくても、セットアップ諸々ネットにたくさん転がってるので調べてみてください。一応、公式のページと参考になりそうなサイトのURL貼っつけておきます。
https://www.raspberrypi.org/forums/viewforum.php?f=82
https://jumbleat.com/2018/10/15/setup_for_raspberry_pi_zero_part2/
#最初に
ブレッドボードにラズパイとセンサー類を繋げていきます。
###ブレッドボードとは?
各種電子部品やジャンパ線をボードの穴に差し込むだけで、 はんだ付けをしなくても、手軽に電子回路を組むことの出来る基板です。
###ジャンパワイヤとは?
回路上にジャンプ(電路のショートカット)を作り、繋ぐもの。
自分はこんな感じで繋げました。
#書いていくぅ
ではでは、さっそく書いていきます。
#include<wiringPi.h>
#include<stdio.h>
#include<time.h>
#include<sys/time.h>
#include<stdlib.h>
#define TRIG 5
#define ECHO 13
int main(void)
{
int timepassed;
double distance;
int soff, son;
struct timeval tvToday;
wiringPiSetupGpio();
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
pinMode(16,INPUT);
digitalWrite(TRIG, LOW);
while(1)
{
digitalWrite(TRIG, HIGH);
delay(0.01);
digitalWrite(TRIG, LOW);
while(digitalRead(ECHO) == LOW)
{
gettimeofday(&tvToday, NULL); //現在時刻
soff = (tvToday.tv_usec);
}
printf("%d\n", soff);
gettimeofday(&tvToday, NULL); //現在時刻
son = (tvToday.tv_usec);
while(digitalRead(ECHO) == HIGH)
{
gettimeofday(&tvToday, NULL); //現在時刻
son = (tvToday.tv_usec);
}
printf("%d\n",son);
timepassed = son - soff;
distance = (double) (timepassed) * (340.29/2.0);
printf("%d\n", timepassed);
printf("距離:%f\n", distance/10000); //cmとミリ秒なので
delay(1000);
if(digitalRead(16) == HIGH)
{
if(distance/10000 < 40)
{
printf("Someone is there.");
system("fswebcam -S 10 -r 1280*720 sample.jpg");
}}else
{
printf("Noboady is there.");
}
delay(1000);
}
}
コードはこんな感じです。
pythonではなくC言語で書きました。
どこから言うべきか悩みますが、適度端折って簡単に説明していきます。
#define TRIG 5
#define ECHO 13
defineを使って定義します。自分の場合は、defineの後にTRIG,ECHOと定義しています。5と13は刺してあるピン番号です。
digitalWrite(TRIG, HIGH);
TRIGにHIGHを出力します。
3V以上をTRIGにかけています。
delay(0.01);
TRIGのHIGHの状態を0.01ミリ秒継続して
↓
digitalWrite(TRIG, LOW);
ECHOにLOWを出力します。
while(digitalRead(ECHO) == LOW)
{
gettimeofday(&tvToday, NULL); //現在時刻
soff = (tvToday.tv_usec);
}
digitalReadは指定したピンを読み込みます。
ECHOがLOWの間繰り返します。
struct型で宣言したtvTodayに現在時刻を入れて
tv_usecはtvTodayの構造体の中のmicrosecond(マイクロ秒)を取ってきています。
printf("%d\n", soff);
ここで、マイクロ秒を表示
gettimeofday(&tvToday, NULL); //現在時刻
son = (tvToday.tv_usec);
while(digitalRead(ECHO) == HIGH)
{
gettimeofday(&tvToday, NULL); //現在時刻
son = (tvToday.tv_usec);
}
printf("%d\n",son);
sonの処理内容はsoffの処理の意味と同じで、HIGHの間繰り返してLOWになったら出力します。
timepassed = son - soff;
distance = (double) (timepassed) * (340.29/2.0);
時刻の差から、物体までの往復の時間を求め、距離を計算します。
音速340/sで往復。
printf("%d\n", timepassed);
int型のtimepassedを表示
printf("距離:%f\n", distance/10000);
これで距離がcmで表示されます。
distanceを/10000するのは0の値を調整するためです。
if(digitalRead(16) == HIGH)
{
if(distance/10000 < 40)
{
printf("Someone is there.");
system("fswebcam -S 10 -r 1280*720 sample.jpg");
}}else
{
printf("Noboady is there.");
}
delay(1000);
}
}
最後のこのif文は16ピンがHIGHの間で40cm以内に動くものがあったら**「Someone is there」を表示させ、カメラを撮ります。
なかったら、「Nobody is there」**を1秒間隔で表示させます。
##だいたいこんな感じ
コード上でこいつら(センサー類)をラズパイがつなげている。
ラズパイ「やい!人感!そこになんかいるか?!」
人感センサー「へい!そこにいますぜ!」
ラズパイ「了解!そしたら!距離センサー!1m以内にきたら教えてくれ!」
距離センサー「おーけー!1m以内にきたぜ!」
ラズパイ「よし!いまだ!カメラよ!やれーーーー!!!」
カメラ「いくぜ!必殺!」
ーーーパシャッ!!---
という流れ。
#終わりに
こんなクソ記事をここまで読んでくださった方々ありがとうございます。
今回触ってみて割と楽しかったので、暇を見つけてまたやっていこうと思いました。
さて、明日はReasinが担当します。
お疲れ様でした。