RaspberryPiを初めて触ったって話

どうも18日目担当の[@Tea_K-M-R](@Tea_K-M-R )です。
今回、Raspberry Pi Zero Wを触ってみました。他の方の記事と比べると劣っていますが温かい目で見てください笑
それではいってみよー！

#そもそもRaspberryPiとは？？
[https://www.sejuku.net/blog/48510](https://www.sejuku.net/blog/48510)
すみません、これ読んでください笑
#使用したもの
RasberryPizero×１
人感センサー×１
距離センサー×１
カメラ×１(自分はLogicoolを使用しました)
ブレッドボード×１
ジャンパワイヤ 複数
#やったこと
今回、やったのは人感センサーで物体を感知したら、距離センサーでその物体との距離を測り「"Someone is there"」と表示させカメラを撮るというものです。
#セットアップ
自分はセットアップする際、「[写真や図解でよくわかる ラズパイZeroを使い倒す本](https://www.amazon.co.jp/%E5%86%99%E7%9C%9F%E3%82%84%E5%9B%B3%E8%A7%A3%E3%81%A7%E3%82%88%E3%81%8F%E3%82%8F%E3%81%8B%E3%82%8B-%E3%83%A9%E3%82%BA%E3%83%91%E3%82%A4Zero%E3%82%92%E4%BD%BF%E3%81%84%E5%80%92%E3%81%99%E6%9C%AC-Raspberry-Zero-W%E5%AF%BE%E5%BF%9C-ebook/dp/B07LGQ3R77)」という本を参考にしました。
リモートのやり方も載っています。（レス遅いのでやらなくても良い気がします）

本じゃなくても、セットアップ諸々ネットにたくさん転がってるので調べてみてください。一応、公式のページと参考になりそうなサイトのURL貼っつけておきます。

https://www.raspberrypi.org/forums/viewforum.php?f=82
https://jumbleat.com/2018/10/15/setup_for_raspberry_pi_zero_part2/



#最初に
ブレッドボードにラズパイとセンサー類を繋げていきます。

###[ブレッドボードとは？](http://www.ee.ibaraki.ac.jp/09student/Lectures/KisoDenki/BB/BB-intro.html)
各種電子部品やジャンパ線をボードの穴に差し込むだけで、 はんだ付けをしなくても、手軽に電子回路を組むことの出来る基板です。
###[ジャンパワイヤとは？](https://dotstud.io/docs/jumperwire/)
回路上にジャンプ（電路のショートカット）を作り、繋ぐもの。

自分はこんな感じで繋げました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316068/3b8adeae-f02e-e74f-3343-5a6cf90f0028.png)


#書いていくぅ
ではでは、さっそく書いていきます。

```hcsr04.c
#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秒間隔で表示させます。


##だいたいこんな感じ
コード上でこいつら（センサー類）をラズパイがつなげている。
ラズパイ「やい！人感！そこになんかいるか？！」
人感センサー「へい！そこにいますぜ！」
ラズパイ「了解！そしたら！距離センサー！１ｍ以内にきたら教えてくれ！」
距離センサー「おーけー！１ｍ以内にきたぜ！」
ラズパイ「よし！いまだ！カメラよ！やれーーーー！！！」
カメラ「いくぜ！必殺！」
ーーーパシャッ！！－－－
という流れ。

#終わりに
こんなクソ記事をここまで読んでくださった方々ありがとうございます。
今回触ってみて割と楽しかったので、暇を見つけてまたやっていこうと思いました。
さて、明日は[Reasin](https://qiita.com/Reasin)が担当します。
お疲れ様でした。