2019年09月

・M5StickC 搭載 BeetleC に近接センサ「APDS9930」を取付し、
 PS3のコントローラで遊んでみました。
 まだまだ、スピードが出すぎて、コントロールは難しいです。






APDS9930


S__41869344


S__41869343




・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 matchbox-keyboard

いざ使うとすると、文字化けで使えません。

下記をインストールして文字化けが直りました。
# sudo apt-get install ttf-kochi-gothic xfonts-intl-japanese xfonts-intl-japanese-big xfonts-kaname
 
以上 めでたしめでたし

・M5StickC で UIFLOW を 使かってみる。


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


webuiflow



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


下記を参照にセットアップする。

M5stack(M5GO)とM5UI.Flowであそんでみた
https://qiita.com/mashed-p/items/1ba7a3dc54e3b766c2a8

uiflow


以上


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

ps3ds


まず、検索デスクをクロームにセットする。
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

***************************************************************

PS3リモートを新しいRaspberry Pi Zero Wに接続する方法
https://www.piborg.org/blog/pi-zero-wifi-ps3

PlayStation 3コントローラーヘルプシート
https://www.piborg.org/blog/rpi-ps3-help

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

・M5StickC 搭載 web 操縦 リモコンカーを作ってみました。

前方衝突防止にAPDS9930近接センサーを搭載しました。
約10cmに壁があると停止又はバックするようにしました。
動画は、デモモードで自動で動いています。




wificar2




wificar3

・M5StickC を使って WiFi 操縦 ミニカーを作ってみました。

S__41738280

S__41738281


前面に近接センサーを付け、追突を防止しようと考えました。
そのため、前後で 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
.....
}

・aitendoの8x8LEDのpin番号を調べてみた

COL,ROWの並びとピン番号の並びはめちゃくちゃですね。

1.
S__41689092


2.
LED8x8PinNo


3.
LED8x8


・BeetleC 概要

マイコン:ST32F030 F4P6
DC Stepper Motor Driver:L9110S
Motor:DC3V 1200 rpm ターン DIY ミニモデルモーター
https://www.aliexpress.com/item/32953011103.html?fbclid=IwAR0zsMxg88UmxZWpf7rQym0mGl1fKLqnnqMWVd3zXJpePqvioC9QUPe3O9w

操縦:サンプルスケッチは Motorが速く webでの操縦がしにくい。

1.
BeetleC-1


2.
BeetleC-2


3.
BeetleC-3


4.
Beetlec-4


5.
BeetleC-5


6.
BeetleC-6



















↑このページのトップヘ