2019年09月
・raspi にて PS3controller を UDP で M5StickC へ接続


・raspi にて PS3controller を UDP で M5StickC へ
接続するためのpythonプログラムです。
プログラムの概要
1. PS3controller をbluetoothで、paspiに接続
2.それをRCWCのフォーマットに変換
3.その後、UDPにてM5StickCに送る
#!/usr/bin/python3
import struct
import socket #UDP送信
import time #待機時間用
from contextlib import closing #with用
host = '192.168.4.1' # IPアドレス(変更する!)
port = 10000 # ポート番号
device_path = "/dev/input/js0"
# unsigned long, short, unsigned char, unsigned char
EVENT_FORMAT = "LhBB";
EVENT_SIZE = struct.calcsize(EVENT_FORMAT)
ps3_RCWC = {0:0x0020,1:0x0040,2:0x0010,3:0x0100,4:0x0200,5:0x0800,6:0x0400,7:0x1000,8:0x000c,9:0x0003,10:0,11:0,12:0,13:0x0001,14:0x0002,15:0x0008,16:0x0004}
data = bytearray([0,0,0,0,0,0,0,0,0,0])
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #ソケットの設定
skip_flg = 0
ct = 0
btime = 0 #前回の時間
bval = 0
ds3_time = 0
ds3_val = 0
with closing(sock): #プログラム終了時にソケットを自動的に閉じる
with open(device_path, "rb") as device:
print("Program Start")
event = device.read(EVENT_SIZE)
while event:
btime=ds3_time
bval=ds3_val
(ds3_time, ds3_val, ds3_type, ds3_num) = struct.unpack(EVENT_FORMAT, event)
print(" ")
print( "{0}, {1}, {2}, {3}".format( ds3_time, ds3_val, ds3_type, ds3_num ) )
print("COUNT=",ct)
ct=ct+1
if ds3_val == 0:
ct=0
if (ds3_type == 2 and ds3_val !=0):
#if ds3_time-btime < 20:
if abs(abs(ds3_val)-abs(bval))<1000:
event = device.read(EVENT_SIZE)
continue
if (ds3_type == 129 or ds3_type == 130):
event = device.read(EVENT_SIZE)
continue
if ct > 100:
event = device.read(EVENT_SIZE)
continue
val=0
if ds3_type == 1: #ボタン圧下判定
skip_flg = 0
if ds3_num in ps3_RCWC:
val = ps3_RCWC[ds3_num] #対応ボタンデータ取得
if ds3_val == 0:
data[0]=0
data[1]=0
else:
data[0]=int(val // 256)
data[1]=int(val % 256)
elif ds3_type ==2: #ジョイスティック判定
skip_flg = 0
if ds3_val == 0: #中点の時
val = 128
data[2]=(val)
data[3]=(val)
data[4]=(val)
data[5]=(val)
else:
if ds3_num == 1: #左側 上下
if ds3_val < 0: # 上側方向
val = 128 + abs(int((ds3_val/256)))
else: # 下側方向
val = 128 - int((ds3_val / 256))
data[3] = (val & 0xff)
elif ds3_num == 0: #左側 左右
if ds3_val < 0: # 左側方向
val = 128 + int((ds3_val/256))
else: # 右側方向
val = 2 * int((ds3_val / 256))
data[2] = (val & 0xff)
elif ds3_num == 3: #右側 左右
if ds3_val < 0: # 左側方向
val = 128 + int((ds3_val/256))
else: # 右側方向
val = 2 * int((ds3_val / 256))
data[4] = (val & 0xff)
elif ds3_num == 4: #右側 上下
if ds3_val < 0: # 上側方向
val = 128 + abs(int((ds3_val/256)))
else: # 下側方向
val = 128 - int((ds3_val / 256))
data[5] = (val & 0xff)
else:
skip_flg = 1
val = 128
data[2]=(val)
data[3]=(val)
data[4]=(val)
data[5]=(val)
print("analog val=",int(val),ds3_val)
# elif (ds3_type == 129 or ds3_type == 130):
# skip_flg=1
else:
skip_flg=1
# print("val=",hex(val),val)
# for i in range(10):
# hex_str = format(data[i],'02x')
# print(hex_str," ",end="")
# print(" ")
#UDP send
if skip_flg == 0:
print("send: ", data) #送信した文字列を送信側に表示
print(" ")
sock.sendto(data, (host, port)) #ソケットにUDP送信
# time.sleep(0.5)
event = device.read(EVENT_SIZE)
・ラズベリーパイ 仮想キーボード 文字化けについて
・ラズベリーパイ 仮想キーボード 文字化けについて
いざ使うとすると、文字化けで使えません。
下記をインストールして文字化けが直りました。
# sudo apt-get install ttf-kochi-gothic xfonts-intl-japanese xfonts-intl-japanese-big xfonts-kaname
以上 めでたしめでたし
下記で、仮想キーボードをインストールする。
$ sudo apt-get install matchbox-keyboard
$ sudo apt-get install matchbox-keyboard
いざ使うとすると、文字化けで使えません。
下記をインストールして文字化けが直りました。
# sudo apt-get install ttf-kochi-gothic xfonts-intl-japanese xfonts-intl-japanese-big xfonts-kaname
以上 めでたしめでたし
・M5StickC で UIFLOW を 使かってみる。
・M5StickC で UIFLOW を 使かってみる。
ここに↓ [web uiflow]接続し、[APIKEY]を設定する。
http://flow.m5stack.com/

ここで↓M5Burner をダウンロードして、M5StickCに焼く。
https://m5stack.com/pages/download

以上
ここに↓ [web uiflow]接続し、[APIKEY]を設定する。
http://flow.m5stack.com/

ここで↓M5Burner をダウンロードして、M5StickCに焼く。
https://m5stack.com/pages/download
下記を参照にセットアップする。

以上
・PS3コントローラをBluetoothでつなげる
PS3コントローラをBluetoothでつなげる

まず、検索デスクをクロームにセットする。
https://www.searchdesk.com/
最近は、apt-getでなくaptを使用するみたい。
$コマンドリストをコピぺしてセットアップする。

まず、検索デスクをクロームにセットする。
https://www.searchdesk.com/
最近は、apt-getでなくaptを使用するみたい。
$コマンドリストをコピぺしてセットアップする。
◆システムのアップデート
$ sudo apt-get update
$ sudo apt-get dist-upgrade
◆日本語フォントのインストール
$ sudo apt-get install fonts-noto-cjk fonts-ipafont fonts-ipaexfont fonts-takao
◆UI のフォント変更
デスクトップの何もない所を右クリックし [デスクトップの設定] を選択 (またはアプリケーションメニューから [設定 | Appearance Settings] )。
[System] タブの [Font] を Noto Sans CJK に変更 (フォントの種類は任意です)。
◆一旦再起動しないとフォントが正しく反映されません。
$ sudo reboot
◆Chromium (ブラウザ) の日本語化
$ sudo apt-get install chromium-l10n
◆LibreOffice (Office スイート) の日本語化
$ sudo apt-get install libreoffice-help-ja
◆PS3コントローラをBluetoothでつなげる
$ sudo apt-get -y install libusb-dev joystick python-pygame
$ cd ~
$ wget http://www.pabr.org/sixlinux/sixpair.c
$ gcc -o sixpair sixpair.c -lusb
$ sudo reboot
$ sudo ~/sixpair
GUIにてコントローラーのペアリング
$ jstest /dev/input/js0
***************************************************************
RaspberryPi Zero WとPS3コントローラをBluetoothでつなげる
http://ei0124.blog.fc2.com/blog-entry-43.html
Pythonでdualshock3の入力を読み取る
https://www.usagi1975.com/30jul170722/
Playstation 3コントローラーの構成
https://pythonhosted.org/triangula/sixaxis.html
http://ei0124.blog.fc2.com/blog-entry-43.html
Pythonでdualshock3の入力を読み取る
https://www.usagi1975.com/30jul170722/
Playstation 3コントローラーの構成
https://pythonhosted.org/triangula/sixaxis.html
・M5StickC 搭載 web 操縦 リモコンカー
・M5StickC にて、i2c を 2チャンネル 使う
・M5StickC を使って WiFi 操縦 ミニカーを作ってみました。


前面に近接センサーを付け、追突を防止しようと考えました。
そのため、前後で i2c を 2チャンネル 使う方がスマートにできそうです。


前面に近接センサーを付け、追突を防止しようと考えました。
そのため、前後で i2c を 2チャンネル 使う方がスマートにできそうです。
最初は、「M5StickC非公式日本語リファレンス」を参照して
下記のスケッチでテストしましたが、ダメでした。
..
M5.begin();
Wire.begin(32, 33); //SDA,SCL
Wire1.begin(0, 26); //SDA,SCL
...
色々テストしていて、理由は、分かりませんが、
一応両方動くようになりました。
Wire1.begin(SDA,SCL)は、使わないで
1.setup()の初期化の時に、それぞれWire.begin(32,33)/(0,26)を設定
2.loop()の中では、近接センサを呼び出す前に都度Wire.begin(32,33);設定
3.終わったらWire.begin(0,26);を再設定する
void setup() {
.......
M5.begin();
Wire.begin(32, 33); //SDA,SCL
// Initialize APDS-9930 (configure I2C and initial values)
if ( apds.init() ) {
Serial.println(F("APDS-9930 initialization complete"));
} else {
Serial.println(F("Something went wrong during APDS-9930 init!"));
}
Wire.begin(0, 26); //SDA,SCL
Wire.setClock(50000);
drvMotorL(0);drvMotorR(0); // STOP
.......
}
void loop(){
.....
Wire.begin(32, 33); //SDA,SCL
if ( !apds.readProximity(proximity_data) ) {
Serial.println("Error reading proximity value");
} else {
Serial.print("Proximity: ");
Serial.println(proximity_data);
}
if (proximity_data>500) {
x=0;y=0;
}
Wire.begin(0, 26); //SDA,SCL
.....
}