pinewell's farmer blog 農業と電子工作、ソフトウェア、バイク、車

2023年1月29日

OrangePi zero2を用いた基準局設備

Filed under: GNSS — pinewell @ 9:31 PM

本来ならRaspberryPiを使いたいのだが入手困難な上、高額となってしまったため試行錯誤。

機能的には充分なOrangePi zero2にしてみた。お値段も手頃。

OSにはarmbianを選択。これとPX1122R-EVBをTX/RXで接続して基準局データを送信することができることを確認。

で、ケースをRaspberryPiと同じサイズにで作成すると上部に余ったスペースが出来た。

まぁケースを小くすることも考えたが、折角なのでOLEDの液晶とタクトスイッチをユニバーサル基板に半田付けして、と。

OLEDの液晶はSSD1306を用いたi2c接続で128×64の解像度。アマゾンでも買える。

まぁ、難儀しましたよ。Raspiと違って圧倒的に情報量が少ない。しかもOrangepi は種類が多くてサンプルがあってもzero2では動かないとか。

pythonのOPi.GPIOも結局まともに動作させられず、pythonからsubprocessを呼び出すなんて美しくない方法でタクトスイッチのON/OFFを取得せざるを得ず。

LCDにはIPアドレスと現在時刻。タクトスイッチの状態を表示。スイッチを5秒以上長押しでシャットダウンできるようにしてみた。

キモはWiringOPでのGPIOコマンドとタクトスイッチの状態を確定させるための10kΩプルダウン抵抗。

#!/usr/bin/env python                                             

import subprocess                                                 
import datetime                                                   
import time                                                       
from oled.device import ssd1306                                   
from oled.render import canvas                                    
from PIL import ImageFont                                         
                                                                  
import ipget                                                      
                                                                  
while True:                                                       
  try:                                                            
    target_ip = ipget.ipget()                                     
    ip = target_ip.ipaddr("eth0")                                 
    break;                                                        
  except:                                                         
    time.sleep(5)                                                 
                                                                                                                                   
device = ssd1306(port=3, address=0x3C)  # rev.1 users set port=0  
                                                                  
font = ImageFont.load_default()                                   

flgPush = False #押されているか                                      
pushStart =0 #押された時間                                           
pushInt = 0                                                          
onStr="OFF"                                                          
                                                                     
flgShutdown = False                                                  
                                                                     
result = subprocess.run(                                             
        "/usr/local/bin/gpio mode 2 in",shell=True,                  
        stdout=subprocess.PIPE,stderr=subprocess.PIPE,text=True)     

while True:                                                                              
    result = subprocess.run(                                                             
            "/usr/local/bin/gpio read 2",shell=True,                                     
            stdout=subprocess.PIPE,stderr=subprocess.PIPE,text=True)                     
    val=result.stdout[0:1]                                                               
    if val == "1" :                                                                      
        if flgPush : #既におされているか?                                               
          pushInt = time.time()-pushStart                                                
        else :                                                                           
          flgPush=True                                                                   
          pushStart = time.time()                                                        
          pushInt = 0                                                                    
        onStr="ON"                                                                       
    else:                                                                                
        if flgPush :#既におされていて離した                                              
          flgPush=False                                                                  
          pushInt = time.time()-pushStart                                                
          onStr="OFF"                                                                    
          if pushInt > 5 :                                                               
              flgShutdown = True                                                         
              onStr="Shutdown..."                                                        
        else :                                                                           
          flgPush=False
          pushInt = 0
          onStr="OFF"

    with canvas(device) as draw:
       font = ImageFont.load_default()
       draw.text((0, 0), ip   ,  font=font, fill=255)
       t_delta = datetime.timedelta(hours=9)
       JST = datetime.timezone(t_delta,'JST')
       now = datetime.datetime.now(JST)
       d=now.date().strftime('%Y/%m/%d')
       draw.text((0, 12),d  ,  font=font, fill=255)
       t=now.time().strftime('%X')
       draw.text((0, 24),t  ,  font=font, fill=255)

       draw.text((0, 40),onStr  ,  font=font, fill=255)
       if not flgShutdown :
         if pushInt>0:
           draw.text((40,40),'{:.2f}'.format(pushInt),font=font,fill=255)
    if flgShutdown :
        break
    time.sleep(0.3)

time.sleep(3)
with canvas(device) as draw:
  draw.rectangle((0, 0, device.width-1, device.height-1), outline=0, fill=0)

print("shutdown")
result = subprocess.run(
         "/usr/sbin/shutdown -h now",shell=True,
         stdout=subprocess.PIPE,stderr=subprocess.PIPE,text=True)

コメントはまだありません »

No comments yet.

RSS feed for comments on this post. TrackBack URL

Leave a comment

Powered by WordPress