×

らずらいと姫の挑戦日記 無線でカメラのデータを送る

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回にすると動作しなくなるという不具合を修正しました。

サンプルプログラムの説明

起動すると自動的に写真を取って、ゲートウェイへ無線送信します。
送信が完了すると、次の写真撮影を開始するまでに10秒間スリープし、
復帰後にまた写真を撮って送信します。これを繰り返します。

 

サンプルプログラムを選択

1) サンプルプログラムを選ぶ
Lazurite IDEを起動後、ファイル -> 07.SwitchSience -> ArduCAM_Mini_5MP_OV5642_Plus_Functions からサンプルプログラムを選択します。

2) 送信先のアドレス部分を書き換える
送信先の無線アドレス(28行目のHOST ADDRESS)を
Raspberry Piの無線機のアドレスに変更します。

camera✿razu pi

受信確認がないブロードキャストだとデータが欠落する可能性があるため、受信確認付きのユニキャストにします。

3) パソコンと接続する
パソコンとLazurite SubGHzを接続し、
ツール → シリアル通信 → 通信ポート → COM×× にチェックが入っていなければチェックします。

4) LazuriteIDEの「マイコンボードに転送」ボタンを押す

 

実験結果

 

カメラで撮った写真がLazurite SubGHzから無線でRaspbery Piに送信し、
撮った画像がPCに送られ、JPEGファイルとして保存することができました✩

こちらが実際に撮ってみた写真です!

 

試し撮り✿姫

撮影したjpgファイルを使えば、簡単にタイムラプス動画も作れそうですね!

是非、おためしください!!

 

 

下記がプログラム内容です!↓


#! /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()

 

上部へ戻る