もがき系プログラマの日常

もがき系エンジニアの勉強したこと、日常のこと、気になっている技術、備忘録などを紹介するブログです。

ラズパイ カメラで撮影してみた!

はじめに

こんにちは。

この記事は Kojirock1一人 Advent Calendar 2019の11日目の記事です。

adventar.org

今回も、事前に買った初心者キットに入っていたものを使いながら色々遊んでみます。

今回はついに念願のカメラを使ってみます。

こちらの参考記事を拝見しながら、実際にやってみました。

raspi-wannabe.com

接続自体は簡単だったのですが、ひと悶着ありました。

やってみた

ラズパイ側の設定は最初に終わっているので、つなぐところからやりました。

f:id:kojirooooocks:20191208032711j:plain

f:id:kojirooooocks:20191208032722j:plain

静止画撮影

以下のコマンドを実行します。

$ raspistill -o test.jpg
mmal: Cannot read camera info, keeping the defaults for OV5647
mmal: mmal_vc_component_create: failed to create component 'vc.ril.camera' (1:ENOMEM)
mmal: mmal_component_create_core: could not create component 'vc.ril.camera' (1)
mmal: Failed to create camera component
mmal: main: Failed to create camera component
mmal: Camera is not detected. Please check carefully the camera module is installed correctly

むむ。 参考サイトであれば、これで撮影できるはず...

カメラの設定やってると思ってたけど、やってなかったかな?と raspi-config を実行して確認してみます。

f:id:kojirooooocks:20191208033101p:plain

やはりenabledになっていました。

エラー文言で探すと以下の情報が。

PiCam異常時の現象 | Research

接続の問題...?

なんか嫌な予感

とりあえず以下のコマンドでそもそも検出されているかどうかも確認します。

$ vcgencmd get_camera
supported=1 detected=0

検出されていない。。。

ケーブルの接続をし直したり、再起動したりどうやっても、最初に上げたエラーのままでした。

藁にもすがる思いで、 raspi-config で出てくるアップデートをしてみます。

f:id:kojirooooocks:20191208033505p:plain

そして、検出チェック...

$ vcgencmd get_camera
supported=1 detected=1

きました!!

実際に撮影してみます!

$ raspistill -o test.jpg

$ ll test.jpg 
-rw-r--r-- 1 pi pi 3668114 12月  8 03:32 test.jpg

できてました!

さっとく取得して撮影具合を見てみます。

f:id:kojirooooocks:20191208034038j:plain

無事にデブ活をしている、うちの猫(こじろう)を撮影することができました!!!

動画撮影

次は参考サイトでも書かれている通り動画も撮影してみます。

すでにカメラモジュールは検出済みなので、コマンドを打てば動きます。

$ raspivid -o test.h264

$ ls -la test.h264 
-rw-r--r-- 1 pi pi 10033476 128 03:41 test.h264

作成されました! 次にmp4に変換します。そのためにgpacというツールをインストールします。

$ sudo  apt-get install gpac -y
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
以下の追加パッケージがインストールされます:
  gpac-modules-base libfreenect0.5 libgpac4
以下のパッケージが新たにインストールされます:
  gpac gpac-modules-base libfreenect0.5 libgpac4
アップグレード: 0 個、新規インストール: 4 個、削除: 0 個、保留: 111 個。
1,787 kB のアーカイブを取得する必要があります。
この操作後に追加で 5,340 kB のディスク容量が消費されます。
取得:1 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libgpac4 armhf 0.5.2-426-gc5ad4e4+dfsg5-5 [1,287 kB]
取得:2 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libfreenect0.5 armhf 1:0.5.3-1 [38.2 kB]
取得:3 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf gpac-modules-base armhf 0.5.2-426-gc5ad4e4+dfsg5-5 [200 kB]
取得:4 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf gpac armhf 0.5.2-426-gc5ad4e4+dfsg5-5 [262 kB]
1,787 kB を 3秒 で取得しました (674 kB/s)
以前に未選択のパッケージ libgpac4:armhf を選択しています。
(データベースを読み込んでいます ... 現在 161131 個のファイルとディレクトリがインストールされています。)
.../libgpac4_0.5.2-426-gc5ad4e4+dfsg5-5_armhf.deb を展開する準備をしています ...
libgpac4:armhf (0.5.2-426-gc5ad4e4+dfsg5-5) を展開しています...
以前に未選択のパッケージ libfreenect0.5:armhf を選択しています。
.../libfreenect0.5_1%3a0.5.3-1_armhf.deb を展開する準備をしています ...
libfreenect0.5:armhf (1:0.5.3-1) を展開しています...
以前に未選択のパッケージ gpac-modules-base:armhf を選択しています。
.../gpac-modules-base_0.5.2-426-gc5ad4e4+dfsg5-5_armhf.deb を展開する準備をしています ...
gpac-modules-base:armhf (0.5.2-426-gc5ad4e4+dfsg5-5) を展開しています...
以前に未選択のパッケージ gpac を選択しています。
.../gpac_0.5.2-426-gc5ad4e4+dfsg5-5_armhf.deb を展開する準備をしています ...
gpac (0.5.2-426-gc5ad4e4+dfsg5-5) を展開しています...
libfreenect0.5:armhf (1:0.5.3-1) を設定しています ...
libgpac4:armhf (0.5.2-426-gc5ad4e4+dfsg5-5) を設定しています ...
gpac-modules-base:armhf (0.5.2-426-gc5ad4e4+dfsg5-5) を設定しています ...
gpac (0.5.2-426-gc5ad4e4+dfsg5-5) を設定しています ...
man-db (2.8.5-2) のトリガを処理しています ...
libc-bin (2.28-10+rpi1) のトリガを処理しています ...

その後以下のコマンドで変換を実行します。

$ MP4Box -fps 30 -add test.h264 test.mp4
AVC-H264 import - frame size 1920 x 1080 at 30.000 FPS
AVC Import results: 146 samples - Slices: 3 I 143 P 0 B - 0 SEI - 3 IDR
Saving to test.mp4: 0.500 secs Interleaving

$ ls -la test.mp4 
-rw-r--r-- 1 pi pi 10034938 12月  8 03:43 test.mp4

Image from Gyazo

デブ活をみられたこじろうの逆襲ドアップ動画がとれました!

終わりに

一時はどうなるかと思いましたが、なんとかなりましたw

やっぱカメラ楽しいですね!

もうちょい色々としたいのですが、ラズパイの記事は今回で終了になります。

次からはアプリの記事を予定してますが、仕事が忙しくなって、そもそも記事をあげられない可能性ありです...

現場からは以上です。

ラズパイ DHT11で温湿度を表示してみた

はじめに

こんにちは。

この記事は Kojirock1一人 Advent Calendar 2019の10日目の記事です。

adventar.org

今回も、事前に買った初心者キットに入っていたものを使いながら色々遊んでみます。

今回はDHT11モジュールという温湿度を図れるもの使ってみます。

こちらの参考記事を見つけましたので、再現してみようと思います。

qiita.com

やってみた

つなぎ方は参考サイトに乗せていただいているものと一緒です。

f:id:kojirooooocks:20191201025452j:plain

f:id:kojirooooocks:20191201025508j:plain

f:id:kojirooooocks:20191201025528j:plain

スクリプト

参考サイトのものを使用させてもらっています。

# coding: UTF-8
# RaspberryPiでDHT11センサーから温湿度データを取得

import time
import dht11
import RPi.GPIO as GPIO

#定義
#GPIO 14 as DHT11 data pin
Temp_sensor=14

#温湿度データ取得
def get_temp():

    GPIO.setwarnings(False)
    GPIO.setmode(GPIO.BCM)

    instance = dht11.DHT11(pin=Temp_sensor)

    while True:
        #データ取得
        result = instance.read()
        return result.temperature,result.humidity

if __name__ == '__main__':
    try:
        while True:
            #温湿度データ取得
            temperature,humidity = get_temp()

            #画面出力
            if temperature == 0:
                continue
            print("Temperature = ",temperature,"C"," Humidity = ",humidity,"%")

            #指定された秒数スリープ
            time.sleep(5)

    except:
        pass

実際に動かしてみました

表示されました!

終わりに

最初は以下の参考記事で再現しようと思っていましたが、例のごとく購入した初心者キットにはいっていたDHT11moduleは 三脚のもので、以下の参考記事とは合致しなかったです。

qiita.com

こういう温度・湿度取れるのはいいですね。 稼働しっぱなしなるかもですが、赤ちゃんがいる部屋を監視して適切な温度・湿度を保つようにとかできそう。

てゆかそういうのはもうあるか...w

現場からは以上です。

ラズパイ I2C LCDで日本語を表示してみた

はじめに

こんにちは。

この記事は Kojirock1一人 Advent Calendar 2019の9日目の記事です。

adventar.org

今回も、事前に買った初心者キットに入っていたものを使いながら色々遊んでみます。

前回の記事で I2C LCDで文字を表示してみました。

今回は日本語を表示してみます。

参考記事を見つけましたので、再現してみようと思います。

terutakke.com

やってみた

つなぎ方は以前の記事と同様です。

f:id:kojirooooocks:20191123043611j:plain

スクリプト

前回のスクリプトの表示部分を変えています。

text1 = u'コンニチワ!'
text2 = u'RasberryPi デス'
text1 = text1.encode('shift-jis')
text2 = text2.encode('shift-jis')

lcd_string(text1, LCD_LINE_1)
lcd_string(text2, LCD_LINE_2)

実際に動かしてみました!

f:id:kojirooooocks:20191126042315j:plain

表示されました!

これって漢字は表示できるのかな?と思ったので、以下のようにスクリプトを編集しました。

text1 = u'コンニチワ!'
text2 = u'埼玉にいるよ'
text1 = text1.encode('shift-jis')
text2 = text2.encode('shift-jis')

lcd_string(text1, LCD_LINE_1)
lcd_string(text2, LCD_LINE_2)

f:id:kojirooooocks:20191126042428j:plain

できませんでした。。。

終わりに

以下のサイトのようにFontをインストールしてゴニョゴニョすればいけるっぽい記事があったので、やってみたのですが、自分ではできませんでした...

一瞬誓っと光るだけで、文字は表示されませんでした。

kinokorori.hatenablog.com

仕事が忙しくなってきたので、今回はこれですいません。。。

現場からは以上です。

write-blog-every-week2回目のアドベントカレンダー

はじめに

こんにちは。

この記事は『write-blog-every-week』のアドベントカレンダー8日目の記事です。

adventar.org

WBEWは今年1周年を迎えました。

なので、今年は2回目のアドベントカレンダーです。

2年目となる今年、若干のメンバーの減少がありながらも、皆さん精力的にブログを書いています。

ちなみに自分の去年のアドベントカレンダー関連記事は以下。

kojirooooocks.hatenablog.com

kojirooooocks.hatenablog.com

kojirooooocks.hatenablog.com

本題

今回の自分の記事では、自分の1年のwbewへの振り返りを行いたいと思います。

よかったところ(Keep)

1. 今年も継続することができた。

病気になったり、仕事がとても忙しくなったり、あとは引っ越しをしたりで、危うく退会寸前まで行きましたが、なんとか続けることができました。

代わりに筋トレとかが全く続かなかったりで、その他が微妙でした...

2. オンライン輪読会が楽しかった。

WBEWではないですが、別のチームでも一緒に活動している @tada_infraさん @kdnaktさんとオンライン輪読会をすることができて、とても勉強になりました。

プライベート・仕事が忙しく、時々抜けてしまう時がありましたが、なんとか完走することができました。

3. ブログにするためにOSSへの貢献が増えた。

普通逆だろって感じですが、OSS貢献へのいいキッカケになりました。

これは来年も積極的に行っていこうと思います。

4. 2回目のアドベントカレンダーを作ることができた。

1年の振り返りでも書きましたが、去年に引き続き、二回目を開催することができました。

ただ、メンバーが純減しているので全部埋まってはいませんが...

まぁ新規メンバーを募集していないのでしょうがないかw

反省すべきところ(Problem)

1. 基本的にブログの質が低水準になった

忙しくなったというのが主な原因ですが、三分の一くらいは、これでもいいか。みたいな、やっつけ感が出てきてしまいました。

どうしても日に追われて書いてしまうことが多くなってたのが原因です。

来年からは1週間の計画をきちんと立てて行動しようと思います。

今後やってみたいこと(Try)

1. 1週間も落とさずかきあげたい。

ルールとして2週連続で書けなければ退会というルールなので、つまり1週書けなくてもセーフになります。

そのルールに甘えて、1週書けなかったときが何度もありました。

毎週書くというチームなので、来年こそは毎週書きたいなと思います。

終わりに

こんな形で、今年の振り返りは以上です。

前年度のアドベントカレンダーでも同じことを言ってますが、やはり書き続けることがとにかく大事です。

WBEWを始める前、僕は本当に継続力のない三日坊主常習犯のダメなやつでした。

そんな僕でも1年間続けることができたんです。

もし参加したい・継続力をつけたいという意欲のある方は、twitterでDMくれれば、招待させていただきます !!

さぁ。来年も頑張るぞ!

ラズパイ I2C LCDで文字を表示してみた

はじめに

こんにちは。

この記事は Kojirock1一人 Advent Calendar 2019の8日目の記事です。

adventar.org

今回も、事前に買った初心者キットに入っていたものを使いながら色々遊んでみます。

今回はI2C LCDというやつを使ってみます。

こちらは、比較的色々と参考記事があったので以下のサイトを参考に再現してみます。

terutakke.com

やってみた

早速つなげてみました。

f:id:kojirooooocks:20191123043611j:plain

コードは参考サイトのものをコピーさせていただき、少し修正を行いました。

バスと、アドレスは 以下のコードで事前に調べています。

コマンド

$ sudo i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- 27 -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --            

スクリプト

# -*- coding: utf-8 -*-
#!/usr/bin/python
from time import sleep
from time import gmtime, strftime
import datetime
import smbus

#initialize GPIO
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.cleanup()

I2C_ADDR  = 0x27
LCD_WIDTH = 16
LCD_CHR = 1
LCD_CMD = 0
LCD_LINE_1 = 0x80
LCD_LINE_2 = 0xC0
LCD_BACKLIGHT  = 0x08
ENABLE = 0b00000100
E_PULSE = 0.0005
E_DELAY = 0.0005
bus = smbus.SMBus(1) # Rev 2 Pi uses 1

def lcd_init():
  # Initialise display
  lcd_byte(0x33,LCD_CMD) # 110011 Initialise
  lcd_byte(0x32,LCD_CMD) # 110010 Initialise
  lcd_byte(0x06,LCD_CMD) # 000110 Cursor move direction
  lcd_byte(0x0C,LCD_CMD) # 001100 Display On,Cursor Off, Blink Off
  lcd_byte(0x28,LCD_CMD) # 101000 Data length, number of lines, font size
  lcd_byte(0x01,LCD_CMD) # 000001 Clear display
  sleep(E_DELAY)

def lcd_byte(bits, mode):
  bits_high = mode | (bits & 0xF0) | LCD_BACKLIGHT
  bits_low = mode | ((bits<<4) & 0xF0) | LCD_BACKLIGHT

  # High bits
  bus.write_byte(I2C_ADDR, bits_high)
  lcd_toggle_enable(bits_high)

  # Low bits
  bus.write_byte(I2C_ADDR, bits_low)
  lcd_toggle_enable(bits_low)

def lcd_toggle_enable(bits):
  sleep(E_DELAY)
  bus.write_byte(I2C_ADDR, (bits | ENABLE))
  sleep(E_PULSE)
  bus.write_byte(I2C_ADDR,(bits & ~ENABLE))
  sleep(E_DELAY)


def lcd_string(message,line):
  # Send string to display
  message = message.ljust(LCD_WIDTH," ")
  lcd_byte(line, LCD_CMD)
  for i in range(LCD_WIDTH):
    lcd_byte(ord(message[i]),LCD_CHR)

def main():
    lcd_init()
    while True:
      local_time = datetime.datetime.now()
      lcd_string("Current Time is", LCD_LINE_1)
      lcd_string(local_time.strftime("%H:%M"), LCD_LINE_2)
      sleep(1)

try:
  main()
except KeyboardInterrupt:
  pass
finally:
  LCD_BACKLIGHT = 0x00
  lcd_byte(0x01, LCD_CMD)
  GPIO.cleanup()

実際に動かしてみました!

f:id:kojirooooocks:20191123043631j:plain

表示されました!

終わりに

今回も参考サイトがあったので助かりましたw

こういう表示系はテンションが上ります。

日本語は表示できないのかな?

もうちょい調べてみます。

現場からは以上です。

ラズパイ 7セグメントディスプレイを光らせてみた

はじめに

こんにちは。

この記事は Kojirock1一人 Advent Calendar 2019の7日目の記事です。

adventar.org

今回も、事前に買った初心者キットに入っていたものを使いながら色々遊んでみます。

今回は7セグメントディスプレイというやつを使ってみます。

こちらは、ぐぐると参考になる日本語記事が見つかったので、今回はこちらのサイトをを参考にさせてもらいながら、やってみます。

www.fabshop.jp

やってみた

早速つなげてみました。

f:id:kojirooooocks:20191123025906j:plain

f:id:kojirooooocks:20191123025924j:plain

f:id:kojirooooocks:20191123025942j:plain

コードは参考サイトのものを拝借しました。

import RPi.GPIO as GPIO
import time

pins = [11,12,13,15,16,18,22,7]
dats = [0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x80]

def setup():
    GPIO.setmode(GPIO.BOARD)
    for pin in pins:
        GPIO.setup(pin, GPIO.OUT)
        GPIO.output(pin, GPIO.LOW)  

def writeOneByte(val):
    GPIO.output(11, val & (0x01 << 0))
    GPIO.output(12, val & (0x01 << 1))
    GPIO.output(13, val & (0x01 << 2))
    GPIO.output(15, val & (0x01 << 3))
    GPIO.output(16, val & (0x01 << 4))
    GPIO.output(18, val & (0x01 << 5))
    GPIO.output(22, val & (0x01 << 6))
    GPIO.output(7,  val & (0x01 << 7))

def loop():
    while True:
        for dat in dats:
            writeOneByte(dat)
            time.sleep(0.5)

def destroy():
    for pin in pins:
        GPIO.output(pin, GPIO.LOW)
    GPIO.cleanup()

if __name__ == '__main__':
    setup()
    try:
        loop()
    except KeyboardInterrupt:
        destroy()

実際に動かしてみました!

www.youtube.com

0〜Fまでの16進数でカウントアップされてまた0からカウントアップされています。

正常に動きました!!

終わりに

今回は参考サイトがあったので助かりましたw

結構コードも、なんというか頑張るコードを書かないと行けない感じで、だんだんつらみが出てきました。

現場からは以上です。

ラズパイ(ZRX-543)で遊んでみようと試みたがだめだった。

はじめに

こんにちは。

この記事は Kojirock1一人 Advent Calendar 2019の6日目の記事です。

adventar.org

今回は参考本ではなく、事前に買った初心者キットに入っていたものを使いながら色々遊んでみます。

初心者キットの中に、 Keypad ZRX-543 という電卓みたいなパーツが入っていたので、早速使ってみました。

f:id:kojirooooocks:20191122023535j:plain

f:id:kojirooooocks:20191122023909j:plain

ぐぐってもあんまり有効な記事が見当たらず、唯一良さげな動画があったので、こちらのとおりに進んでみました。

www.youtube.com

やってみた

早速つなげてみました。

f:id:kojirooooocks:20191122042315j:plain

コードも動画のとおりに書いてみます。

# -*- coding: utf-8 -*-

import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BOARD)

MATRIX = [
    [1, 2, 3, 'A'],
    [4, 5, 6, 'B'],
    [7, 8, 9, 'C'],
    ['*', 0, '#', 'D'],
]

ROW = [7, 11, 13, 15]
COL = [12, 16, 18, 22]

for j in range(4):
    GPIO.setup(COL[j], GPIO.OUT)
    GPIO.output(COL[j], 1)

for i in range(4):
    GPIO.setup(ROW[i], GPIO.IN, pull_up_down = GPIO.PUD_UP)

try:
    while(True):
        for j in range(4):
            GPIO.output(COL[j], 0)
            for i in range(4):
                if GPIO.input(ROW[i]) == 0:
                    print MATRIX[i][j]
                    while (GPIO.input(ROW[i]) == 0):
                        pass
            GPIO.output(COL[j], 1)

except KeyboardInterrupt:
    GPIO.cleanup()

実際に動かすと、妙な動き...

f:id:kojirooooocks:20191122043944g:plain

入力していないのに入力されたり、ボタンを連続で押されたりと、なかなか難しい。

多分配線がおかしいんだと思いますが、どこがどうおかしいのかわからず、このあと一時間くらい頑張りましたが、動かず断念しました。

終わりに

初心者キッドには各ツールの説明書がないので、わからなかったら謎のままで終わっちゃうのが残念なところです。。。

自分に基礎知識があれば、「ああ。これはここ繋げばいけるっしょ」みたいに変換できると思うのですが、いかんせんそこまで想像力が働かないので、今回はここまで。

リベンジはしたいと思います!