制作メモ(arduino,raspberripi,xbee,pic,塗装)

個人的な制作メモ。

●秋月で購入したarduino用XBeeシールドを使うときの基板上のスイッチ設定。
1.RUN+Xbee:
通常使用時。

2.RUN+USB:
XbeeをPCに接続時。XCUTで設定の時など。
この設定のまま、ArduinoIDEからシリアル通信のデバッグをすると、直接Xbeeに送信することができる。これをオンにしている場合は、他のXbeeと通信されているが、おそらく受信できない状態になる模様。他のXbeeには送信はできる。

3.PROG:
Arudinoにスケッチを書き込める。Arduinoに書き込む時は、XBeeを外してからするように書かれているウェブサイトがあった。おそらく引き抜かなくてよくなる。

●XCTU※Xbeeの初期設定をするソフト
1.Arudinoに上記のシールドを付けたXbeeとPCを繋げる
Aruduinoにプログラムが入っているとXCTUで認識せず、エラーが起こる。Arduinoには「何もしないスケッチ」void setup(){} void loop(){}を上書きしておく必要がある。

2.ID等の設定
IDは0でも通信できたが 、Transparent modeで3台以上繋げる場合は、0以外で指定しないといけないようだ。コーディネーター1台、ルーター2台を繋げた時の設定を下記に残しておく。

コーディネーター
ID 777 ←何でもよい
DH 0000 
DL FFFF
AP Transparent mode

ルーター
ID 777
DH 13A200 ←機器の型番みたいなもの。MACアドレス前半
DL コーディネーターのMACアドレスの後半部分
AP Transparent mode

コーディネーターDH,DLは、一対一で通信する場合、ルーターのMACアドレスにしても繋がった。DH,DLの0000,FFFFの設定は、同じIDのネットワーク内すべての機器に同じデータを送信できるという特別なルール。他に0000,0000で設定すると、コーディネーターのみに送信できるという設定になるらしい。これだけ見ると簡単そうだが、かなり苦戦した。

ATモードでも3台以上のXBeeを通信させることはできるようだったが、通信のタイミングが難しいのか、シリアル通信が複数繋がろうとしてます的なエラーが出てできなかった。結局APIモードでの制作に切り替えた。

●XBee
1.起動同期
Arduinoとraspberry pi をXbeeを介してシリアル通信をするとき、シリアル通信がいつまでも繋がらないという場合があった。機器の立ち上げ時に、起動したか確認する部分をプログラムする必要があったようだ。また、raspberry pi側のXBeeを外したり付けたりしていると繋がっていたので、GPIOピンにリレーを付けてXBeeの電源をオンオフするようにした。XBeeの+Vピンを直接GPIOに繋げると、LOWにしてもいつまでも電源が入っているようだったため、このような形をとった。以下にプログラムを示しておく。

def xbee_check():
 xbee = 18
  while True:
   serial_write(‘z’) #arduinoへ文字を送信
   x=ser.readline().strip() #Arduinoからの受信待ち
   print(x)
   time.sleep(1)
   if not x:
    serial_write(‘z’) 
   else: 
    print(“conected to arduino”)
    break
  #XBeeのGND側にリレーを入れて、電源オンオフ。
  GPIO.output(xbee, False)
  GPIO.output(xbee, True)

2.ATモード
いくつかのウェブサイトでATモードでの複数台の連携も可能であるとの内容が見受けられた為、3台のXBeeで試してみたが、様々な不具合が出たため、プログラムで送信のタイミングなどをかなり計算してやらないと難しいのではないかと予測。
2台でのシリアル通信であっても、マルチプロセス中に送信が二つに分かれる部分で、不具合がかなり出た。最初はプログラムの書き方に問題があるのだと考え、試行錯誤をしていたが、そうではなくてATモードでマルチプロセスをすると問題が出ることがあるということではないかと予測。具体的には、UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xff in position 0というエラーと、serial.serialutil.SerialException: device reports readiness to read but returned no data (device disconnected or multiple access on port?)の2つで何日も悩んだ。ATモードではAPIモードのようにデータの始まりと終わりを示す部分や、始まりと終わりが分からない場合に無視する機能がないからかもしれない。マルチプロセスでいくつかに分けると、不完全なデータを飛ばしてしまうのかも。

3.APIモード
三台を繋げるには、やはりAPIモードになりそうだと分かり、取り組んだが制作時間が足りずに途中までとなった。raspberrypiはxbee-pythonというライブラリで、ATモードでつくっていたプログラムを少し変更するだけで送受信できそうだったが、Arduinoとpicはxbeeのライブラリを使った例があまりなく、ずいぶん難しい。受信するところまではできたが、必要なデータをどうやって取り出すかハマってしまったところまでで、時間切れとなった。次回作までにはできるようになりたい…。これができると、作品を見せるときの仕込み方がシンプルにできるようになったり、やれることの幅がいっきに広がりそうだ。プログラムも、構造体とかポインタとか、まだ全然分かっていないので上達できるかも…。

追記 arduinoのxbeeライブラリは使い方は試行錯誤したがよく分からなかったのだけど、XCTUのAPIフレームジェネレータみたいなやつで出てくる16進数の文字列を使ってうまく送信できた。3台目のXBeeは、XBeeのIOピンを使って制御した。これはxbee-pythonからできた。

●回路
1.分圧
PICの5vからXBee用の3vを得るためには、抵抗を繋げて分圧する方法がある。
分圧抵抗で検索。

2.原点復帰
ステッピングモーターのスタート基準になる場所を、スイッチ等をつけて作ることで、モーターのズレ等を修正できる。原点復帰で検索。スイッチではなくは、フォトマイクロセンサなどを使用した例が多数出てくるが、今回はマイクロスイッチで試した。ギミックを作るのが大変だが、問題ない。

3.リレーモジュール
PICとraspberrypiや、raspberrypiとxbee、AC100V機器とarduinoのように、電圧が違うものと繋げる時には、amazonで購入した安いリレーモジュールを使った。今までは、抵抗で分圧したり、フォトカプラを入れてみたりしてきたが、毎回計算が面倒だったし、たまに燃えたりして上手くいかないこともあったが、リレーモジュールで代用。オンオフでカチカチなってしまうが、安いし楽だから、今回はこれでいく。

このリレーモジュールとAC100V機器を繋げてオンオフするときに、ノイズが発生してプログラムがうまく動かないという現象が起きた。いろいろ試行錯誤したがうまくいかなかったため、別のソリッドステートリレーを使うことにしした。ノイズが発生すると、不具合の原因を見つけるのがとても難しいため、かなり時間を費やすことになってしまった。安いモジュールは、使用環境によって何か問題出るから安いのかもしれない。。。

●プログラム
①ラズパイのメモリ開放
freememory.sh 内に下記を書き込む
!/bin/bash
sudo /bin/sync
sudo /bin/sync
sudo /sbin/sysctl -w vm.drop_caches=3

main.py
import subprocess
def main():
subprocess.Popen([‘sudo’,’/home/pi/~~~/freememory.sh’])
if name == “main”:
main()

これで、毎回メモリを開放するようになりました。

②xbee-python
from digi.xbee.devices import XBeeDevice, XBeeMessage, RemoteXBeeDevice, XBee64BitAddress
from digi.xbee.io import IOLine, IOMode, IOValue

#シリアル通信設定
xbee = XBeeDevice(“/dev/ttyS0”, 9600)
xbee.open()

#リモートXBee設定
remote1 = RemoteXBeeDevice(xbee, XBee64BitAddress.from_hex_string(“XBee1のアドレス”)) 
remote2 = RemoteXBeeDevice(xbee, XBee64BitAddress.from_hex_string(“XBee2のアドレス “))
#XBee2のIOピンDIO12を使えるようにセット
remote2.set_io_configuration(IOLine.DIO12, IOMode.DIGITAL_OUT_LOW)

#送信
def serial_write(xbee_remote,str):
xbee.send_data(xbee_remote,str)
time.sleep(0.5)
xbee.send_data(xbee_remote,str)  #原因がよく分からなかったが二回送信しないと送れない場合があった

serial_write(remote1,’a’) #XBee1にaと送る

#XBee1からの受信
if xbee.read_data():
xbee_message = xbee.read_data_from(remote1,20)
data = xbee_message.data
b = data
str1 = b.decode()
print(str1)

#XBee2のIOピンの制御
remote2.set_dio_value(IOLine.DIO12, IOValue.HIGH)
remote2.set_dio_value(IOLine.DIO12, IOValue.LOW)

③ラズパイ電源スイッチ
#入力ピンの設定
power = 26
GPIO.setmode(GPIO.BCM)
GPIO.setup(power, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
#スイッチが押された時の処理
def button_pressed(channel):
subprocess.call([‘sudo’, ‘shutdown’, ‘-h’, ‘now’])
GPIO.add_event_detect(power, GPIO.RISING, callback=button_pressed, bouncetime=200)

電源スイッチは以前購入していた、●ウレタン塗装
1.ウレタンクリア
ラッカー塗装の上にウレタン塗装はできるが、ペイント薄め液で使用するタイプの油性塗料では上手くいかない可能性有。ウレタンクリアは、じょじょにシンナーを多くして最終的にはシャバシャバの状態で吹き付けるとのこと。硬化剤を入れず、ウレタンシンナーだけで吹き付けるという荒業もあるらしい。強度は出ないが硬化剤よりも早く固まるとのこと。

今回ミスをしたのは、最後までシンナーをあまり使わず、厚めにクリアを吹き付け過ぎたことが原因だろう。ゴムのような層ができてしまい、爪で押すといつまでも柔らかい感じになってしまった。ウレタンは硬度があまり出ず柔らかい樹脂のようだ。

2.梱包
塗面が柔らかいため、梱包方法に試行錯誤した。結果としては、ギターケースのように製品と触れる部分にボア生地を入れることで解決。

3.研磨
大きなたれが出た場合は、カッターナイフの側面で削った後、通常の研磨をすると良い。