らずらいと姫の挑戦日記 無線でカメラのデータを送る
2018-11-19
こんにちは、らずらいと姫です。
さて、今回はLazurite SubGHzでカメラの情報を取得し、無線でRaspberry Piのゲートウェイに送信するプログラムができたそうなので、動かしてみたいと思います!
システム構成
マイコンボード
Lazurite SubGHz
カメラモジュール ArduiCAM
ゲートウェイ & カメラ画像の保存
Raspberry Pi 3
Lazurite Pi Gateway
手順
Raspberry Pi側の設定
Lazurite Pi Gatewayのドライバインストールは、こちらを見て無線信号が取得できるまでは完成させてください。
無線信号の送受信ができるようになったら、今回はrubyで無線受信したJPEGの画像データをRaspberry Piで受信し、受信するたびに連番のファイル名(sample 000x.jpg)で保存するプログラムを実行します。
プログラムはページの最後に貼り付けしました!
“./sample_rx_jpq.rb 36” など、
プログラム名の後ろに無線のチャンネル番号を指定すると動作します。
Lazurite SubGHz側の手順
評価ボードを組み立てる
こちらのページに従ってボードを組み立てます。
↓
配線は、下記表を参考にしてください。
色 | Lazurite SubGHz | カメラ |
オレンジ | 7 | CS |
黄色 | 11 | MOSI |
みどり | 12 | MISO |
青 | 13 | SCK |
むらさき | GND | GND |
グレー | 3.3V | VCC |
白 | A4 | SDA |
黒 | A5 | SCL |
最新版のLazurite IDEをダウンロード
Lazuriteのホームページから最新版のLazurite IDEをダウンロードし、インストールしてください。
また、ここから追加のパッケージをダウンロードして、Unzipした後、LazuriteIDE(c:\LazuriteIDE)のlibraries, examplesのフォルダにファイルを保存します。
※2018年12月21日 カメラデータの送信間隔を1時間に1回にすると動作しなくなるという不具合を修正しました。
サンプルプログラムの説明
起動すると自動的に写真を取って、ゲートウェイへ無線送
送信が完了すると、次の写真撮影を開始するま
復帰後にまた写真を撮って送信します。これを繰り返します。
サンプルプログラムを選択
1) サンプルプログラムを選ぶ
Lazurite IDEを起動後、ファイル -> 07.SwitchSience -> ArduCAM_Mini_5MP_OV5642_Plus_Functions からサンプルプログラムを選択します。
2) 送信先のアドレス部分を書き換える
送信先の無線アドレス(28行目のHOST ADDRESS)を
Raspberry Piの無線機のアドレスに変更します。
受信確認がないブロードキャストだとデータが欠落する可能性があるため、受信確認付きのユニキャストにします。
3) パソコンと接続する
パソコンとLazurite SubGHzを接続し、
ツール → シリアル通信 → 通信ポート → COM×× にチェックが入っていなければチェックします。
4) LazuriteIDEの「マイコンボードに転送」ボタンを押す
実験結果
カメラで撮った写真がLazurite SubGHzから無線でRaspbery Piに送信し、
撮った画像がPCに送られ、JPEGファイルとして保存することができました✩
こちらが実際に撮ってみた写真です!
撮影したjpgファイルを使えば、簡単にタイムラプス動画も作れそうですね!
是非、おためしください!!
下記がプログラム内容です!↓
[ruby]
#! /usr/bin/ruby
# -*- coding: utf-8; mode: ruby -*-
# Function:
# Lazurite Sub-GHz/Lazurite Pi Gateway Sample program
# SerialMonitor.rb
require ‘LazGem’
laz = LazGem::Device.new
# Halt process when CTRL+C is pushed.
finish_flag=0
Signal.trap(:INT){
finish_flag=1
}
if ARGV.size == 0
printf("please input argument of ch at leastn")
printf("command format is shown below…n")
printf("./sample_rx.rb ch panid baud pwrn")
printf(" ch: 24-61n")
printf(" panid: 0-0xffffn")
printf(" baud: 50 or 100n")
printf(" pwr: 1 or 20n")
exit 0
end
# open device deriver
dst_addr = 0xffff
ch = 36
panid = 0xabcd
baud = 100
pwr = 20
if ARGV.size >0
ch=Integer(ARGV[0])
end
if ARGV.size > 1
panid = Integer(ARGV[1])
end
if ARGV.size > 2
baud = Integer(ARGV[2])
end
if ARGV.size > 3
pwr = Integer(ARGV[3])
end
laz.init()
print(sprintf("myAddress=0x%016xn",laz.getMyAddr64()))
print(sprintf("myAddress=0x%04xn",laz.getMyAddress()))
laz.begin(ch,panid,baud,pwr)
laz.rxEnable()
# main routine
$last_byte = nil
$rx_jpeg = false
$jpeg_data = []
$jpeg_file_offset = 0
$num = 0
while finish_flag == 0 do
if laz.available() == 0
sleep 0.01
next
end
rcv = laz.read()
data = rcv["payload"].unpack("llC*");
len = data.length
offset = data[1]
data[2..len-1].each {|d|
if $last_byte ==nil then
$last_byte = d
next
end
if $last_byte == 0xFF && d == 0xD8 then
$jpeg_data = []
$rx_jpeg = true
$jpeg_data.push(0xFF)
$jpeg_data.push(0xD8)
$jpeg_file_offset = 0
p "start JPEG receive"
elsif $last_byte == 0xFF && d == 0xD9 then
$jpeg_data.push(0xD9)
$rx_jpeg = false
f = open("sample"+(‘000’+$num.to_s)[-4,4]+".jpg", "wb")
$num += 1
f.write($jpeg_data.pack("C*"))
f.close
p "end of JPEG receive"
elsif $rx_jpeg == true then
$jpeg_data.push(d)
end
$last_byte = d
}
if $jpeg_file_offset != 0 && (offset – $jpeg_file_offset) != 128 then
p "data receive error"
end
$jpeg_file_offset = offset
#print(rcv[‘payload’])
end
# finishing process
laz.remove()
[/ruby]