忍者ブログ

設備のマニアどっとこむ

設備、電子工作、DIYのブログ!

03/05

Tue

2019

AWSでラズパイの位置情報を公開する

前回、前々回でラズパイからAWSへ温湿度と画像データのアップロードができたので今度は位置情報の公開にチャレンジします。

以前購入したGPSモジュールで座標を取得してCSVでAWSへアップロード、Googleマップにピンを入れるようにします。

→GPSモジュールのセットアップについての記事はこちら


↑こんな感じです



まずはラズパイ上に位置情報CSVを作成します。
micropyGPSだけはここからmicropyGPS.pyをダウンロードして同じディレクトリにいれてください。
import serial
import micropyGPS
import threading
import time
import math
import csv
gps = micropyGPS.MicropyGPS(9, 'dd') 
                                     
def rungps(): 
    s = serial.Serial('/dev/serial0', 9600, timeout=10)
    s.readline() 
    while True:
        sentence = s.readline().decode('utf-8') 
        if sentence[0] != '$': 
            continue
        for x in sentence: 
            gps.update(x)
gpsthread = threading.Thread(target=rungps, args=()) 
gpsthread.daemon = True
gpsthread.start() 
#logger_latitude = 3540.8061
decimal, integer = math.modf(gps.timestamp[1]/100.0)
gps_latitude = integer + decimal / 60.0 * 100.0
decimal2, integer2 = math.modf(gps.timestamp[2]/100.0)
gps_latitude2 = integer2 + decimal2 / 60.0 * 100.0
while True:
    if gps.clean_sentences > 20: 
        h = gps.timestamp[0] if gps.timestamp[0] < 24 else gps.timestamp[0] - 24
        print('%2d:%02d:%04.1f' % (h, gps.timestamp[1], gps.timestamp[2]))
        print('緯度経度: %2.8f, %2.8f' % (gps.latitude[0], gps.longitude[0]))
        print('海抜: %f' % gps.altitude)
        print(gps.satellites_used)
        print('衛星番号: (仰角,方位角, SN比)')
        for k, v in gps.satellite_data.items():
            print('%d: %s' % (k, v))
        print(gps.latitude[0])
        if  gps.latitude[0] > 0:
         with open('gps.csv','a') as f:
           writer = csv.writer(f)
           #writer.writerow([h,gps.timestamp[1],gps.timestamp[2],gps.latitude[0],gps.longitude[0]])
           writer.writerow([h, gps.timestamp[1], gps.timestamp[2],gps.latitude[0],gps.longitude[0]])
    time.sleep(3.0)

これでCSVが作成されます。
GPSがつかまらない場合は追記しません。 if  gps.latitude[0] > 0: としています。

あとはこの記事を参照にAWSのS3へアップロードしていきます。


ブラウザでGPSのデータを読み込むのにjavascriptを使う必要があります。
CSV値の後ふたつの値をとります。
<!DOCTYPE html>
<html lang="ja">
<head>
<title>test</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
<style>
html,body {
margin: 0;
padding: 0;
overflow: hidden;
}
</style>
</head>
<body>
    <a id="map">地図</a>
<script type="text/javascript">
function getCSV(){
    var req = new XMLHttpRequest();
    req.open("get", "gps.csv", true);
    req.send(null);
    req.onload = function(){
convertCSVtoArray(req.responseText);
    }
}
 
function convertCSVtoArray(str){
    var tmp = str.split("\n");
    var val = tmp.slice(-2)[0];
    var lat = val.split(',').slice(-2)[0];
    var lng = val.split(',').slice(-1)[0];
    
    var link = document.getElementById('map');
    link.setAttribute('href', 'https://maps.google.co.jp/maps?q='+lat+','+lng);
}
 
getCSV();
</script>
</body>
</html>
位置がずれたりちょっと不安定な動きをしますが、屋外にラズパイをもっていくとGooglmap
ピンがささり、位置情報を公開することができました。

ちなみに・・。


モバイルバッテリーは必須です!! wi-fiはテザリングでなんとかなりますが…










拍手[0回]

PR

02/24

Sun

2019

ラズパイからAWSへ温湿度CSVのアップロード

今回はかなりオーソドックスなIoTをやってみようかと思います。前回はAWSへの画像のアップロードだけだったんですが、今度はHPまで作ってそこからCSVをダウンロードできるようにしてみます。 

DHT11を使いました。3本足はそれぞれ5V、GND、14ピンに接続します。


ラズパイからCSVファイルを出力できるようにします。
import time
import datetime
import dht11
import RPi.GPIO as GPIO
import csv
Temp_sensor=14
def main():
  GPIO.setwarnings(False)
  GPIO.setmode(GPIO.BCM)       
  instance = dht11.DHT11(pin = Temp_sensor)
  while True:
       
        result = instance.read()
        print"Temperature =",result.temperature,"C"," Humidity = ",result.humidity,"%"
        time.sleep(2)
        with open('dht.csv','a') as f:
           
           writer = csv.writer(f)
           writer.writerow([datetime.datetime.now(),result.temperature,result.humidity])
           
        f.close()
print('done. see dht.csv')
            
if __name__ == '__main__':
  try:
    main()
  except KeyboardInterrupt:
    pass
これでdht.csvというCSVファイルができました。
このファイル前回の要領でS3へアップロードしていきます。
前回は画像ファイルtest.jpgだったものをdht.csvへ変更するだけでOKです。
(同じフォルダに入れる必要があります)

今度はAWS側の設定です。

S3にindex.htmlファイルを作って公開できる設定にします。




パブリックアクセスをEvery Oneにするとだれでもアクセス可能になります。
アップロードしたファイルを同じバケットにしてhtmlで関連付けました。

こんな具合でできました。CSVがダウンロードできるはずです!










拍手[0回]

02/17

Sun

2019

ラズパイカメラからAWS S3への写真のアップロード

データセンター業界では最近AWSって大手クラウドとしてよく聞くけど、実際サービスってどんな感じかな~ って思ってました。 1年間は無料なので今回ラズパイとの連携をやってみることにしました。
まずはAWSのアカウントを取得してください。いきなりカード番号を聞かれますが大丈夫です笑
はじめにS3というストレージサービスでバゲットを作ります。
(ここに画像データを送ります)
 
あとは右上のタブからセキュリテイ認証を選択して
アクセスキー (アクセスキー ID とシークレットアクセスキー)を取得します。
(ここでコピーしておいて下さい)
あとでラズパイ上で使います。
今度はユーザーと紐づけていきます。
AWS S3FullAccessのポリシーをアタッチしてください。
あとはラズパイの準備!
必要なパッケージをインストールしていきます。
pip install boto3
pip install awscli
あとはアクセスキー ID とシークレットアクセスキーを設定していくのですが、
ここでエラーが出ることがあります。
aws configure
AWS Access Key ID [None]: ***********
AWS Secret Access Key [None]: ***********
Default region name [None]: ***********
Default output format [None]: json
configureのコマンドが見つからないといった症状がでればこちらでインストールしてください。
pip install awscli --upgrade
画像をアップロードするコードです。
BUCKET_NAME = '*******'はS3で作成したバケット名をいれて下さい
import sys
import threading
import boto3
# boto3 (.aws/config)
BUCKET_NAME = '*******'
class ProgressCheck(object):
    def __init__(self, filename):
        self._filename = filename
        self._size = int(os.path.getsize(filename))
        self._seen_so_far = 0
        self._lock = threading.Lock()
    def __call__(self, bytes_amount):
        with self._lock:
            self._seen_so_far += bytes_amount
            percentage = (self._seen_so_far / self._size) * 100
            sys.stdout.write(
                    "\r%s / %s (%.2f%%)" % (
                        self._seen_so_far, self._size,
                        percentage))
            sys.stdout.flush()
def UploadToS3():
    # S3Connection
    s3 = boto3.resource('s3')
    s3.Object(BUCKET_NAME, 'test.jpg').upload_file('test.jpg')
UploadToS3()  
これでtest.jpgをアップロードできます。S3で確認できました。


もしエラーになることがあればこちらのコマンドでアクセスキー ID とシークレットアクセスキーを設定してみてください(自分はここでハマりました・・)
aws configure set aws_access_key_id AKIA****************
aws configure set aws_secret_access_key ***************
自動でアップロードをするなら
raspistill -w 480 -h 360 -n -o test.jpg
などと絡めてシェルスクリプトをcrontabに登録しておけば定期投稿できます。

ちなみにAWSはアプリもあるので携帯でも見れます!!
(S3などのサービスに限定されますが)


ラズパイでIotをやるならAWSは要チェックですね…
IoT coreとかも手を出していこうかと・・。
 










拍手[0回]

02/09

Sat

2019

ラズパイで庭の野良猫退治

最近家の庭の野良猫がひどい。 ベビーカーに放尿するわ、コケ庭は荒らすわで困っていた。
以前の記事「庭に来る猫対策」で、OpenCVで猫の顔を特定するというのをやったんだけど、猫の顔をカメラで認識するだけで特にその後はアクションしていなかった。

今回はもう一歩すすんで猫対策をしてみようと思う。猫を認識したら水をかけてみることにした。

そもそも猫に水なんてかけていいのかな? 虐待にならないか心配なので区のホームページを見てみた。

http://www.city.ota.tokyo.jp/seikatsu/hoken/pet_dog_cat/aigo/hun.html

虐待にならない範囲であれば水はかけてもいいらしい。

ラズパイでは5Vか3.3Vしか使えないのでUSB出力からポンプで水を出すことにした。




ラズパイでUSBをON、OFするのには以下のコマンドでできる。

sudo hub-ctrl -b 1 -d 2 -P 2 -p 0

最後のpのあとの数字を0にするとOFF、1にするとONになる。

sudo hub-ctrl -b 1 -d 2 -P 2 -p 1

あとでpythonで使用するためとりあえずシェルスクリプトにしておきます。

usbon.shがON
usb.shがOFF  

これを呼び出してUSBをON、OFFしていきます。 ここで気を付けなければいけないのですが、OpenCVでUSBカメラを使用すれば当然USBをOFFしたときにフリーズしてしまうのです。
(個別にUSBポートをOFFするのは断念してしまった・・。)

そこで今回、夜間使用することもあってか赤外線カメラを使用することにした。
USBではなく、ラズパイカメラ用のケーブルを使うのでUSBを気にせず使えます。


ラズパイとモバイルバッテリーをくっつけるとこんな感じです。


ラズパイカメラを使うにはpicameraのインストールが必要です。

pip install picamera

↓夜の庭でも画像はばっちり。


続いてコードです。


猫の学習モデルはこちらの記事を参考にしてください。
この行でフルパス指定してください →  '/home/pi/opencv-3.1.0/data/haarcascades/cascade.xml'


import numpy as np
import sys
from picamera.array import PiRGBArray
from picamera import PiCamera
import cv2
import time
import os
FRAME_W = 800
FRAME_H = 800
os.system('sudo sh usb.sh')
cascPath = '/home/pi/opencv-3.1.0/data/haarcascades/cascade.xml'
faceCascade = cv2.CascadeClassifier(cascPath)
camera = PiCamera()
camera.resolution = (FRAME_W, FRAME_H)
camera.framerate = 32
rawCapture = PiRGBArray(camera, size=(FRAME_W, FRAME_H))
time.sleep(0.1)
for image in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True):
    frame = image.array
    
    
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    gray = cv2.equalizeHist( gray )
    
    faces = faceCascade.detectMultiScale(gray, 1.1, 3, 0, (10, 10))
    
    
    for (x, y, w, h) in faces:
        
        cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
        os.system('sudo sh usbon.sh')
        time.sleep(3)
        os.system('sudo sh usb.sh')
        cv2.imwrite('cat2.jpg', frame)
        
    frame = cv2.resize(frame, (800,800))
   
    cv2.imshow('Video', frame)
    key = cv2.waitKey(1) & 0xFF
    rawCapture.truncate(0)
    if key == ord("q"):
        break
cv2.destroyAllWindows()

猫のフレームを検知した場合、あらかじめ作ったシェルスクリプトでポンプをON、OFFしています。 ついでにcv2.imwrite('cat.jpg', frame)でcat.jpgという画像を保存することができます。


これで猫がきたら・・・。



チョロチョロチョロ・・・。







拍手[0回]

01/27

Sun

2019

ラズパイでQRコードリーダーの作成

QRコードって、携帯アプリとか空港とかで使うイメージなのですが、カメラさえあれば割とあっさりラズパイでできました。

今回OpenCVとpyzbarを使っています。

このサイトを参考にしました。OpenCVのインストールについてはこちら参考にしてください。

OpenCVさえインストールできればさほど難しくないと思います。

QRコードを認識するpyzberのインストールをします。

 sudo pip install pyzbar

以下サンプルのソースコードです。
import cv2
from pyzbar.pyzbar import decode


cap = cv2.VideoCapture(0)

cap.set(cv2.CAP_PROP_FPS, 30)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)

while True:
ret, frame = cap.read()

gray = cv2.cvtColor(frame, cv2.COLOR_RGBA2GRAY)
data = decode(gray)
for symbol in data:
if symbol.type == "QRCODE":
print(data[0][0].decode("utf-8", "ignore"))

if cv2.waitKey(1) == 27:
break

cap.release()
cv2.destroyAllWindows()

python3で動かない場合はターミナルからsudo python ***.pyといった具合にpython2で動作させてください。


うまくいくとこんなコードをカメラが認識します。



このブログのURLがでてきました!!
・・・うまく使えば、QRコードで動作する電子錠とかつくれるかな??

QRコード自体はこちらのぺージで作成できます。

https://qr.quel.jp/?fbclid=IwAR2LqvnugdQ2gKPl2QSiCNJtj4B1KZ_XwD-qfODJGqZ2G79hBmOWPG2qqY4




ラズパイとWEBカメラ…  あとはオープンソースなのでQRリーダーはこんなに安くできるんですね。




拍手[0回]

翻訳(Translate)

AD

シェアしてね

プロフィール

HN:
アルティメット雅史
性別:
男性
自己紹介:
製油所、データセンター、化学工場を渡り歩いた設備のマニア
最近はarduino,Raspberry pi等の電子工作にハマる。
取得資格は電験3種、消防設備士甲4、2級ボイラー技士、危険物乙4、電工2種、技術士補(電気・電子)、エネ電、フォークリフトほか

カウンター

お問い合わせ

忍者アクセスランキング

Copyright © 設備のマニアどっとこむ : All rights reserved

TemplateDesign by KARMA7

忍者ブログ [PR]