投稿

スーパーファミコン コントローラーの無線化プロジェクト:コントローラー状態の読み取り

イメージ
 スーパーファミコンのコントローラーは、本体からP/Sのパルスと、CLKの供給を受けて、そのタイミング事に、ボタンの押している状態を返す。 無線化する際に、本体側のP/Sなりを子機にあたるコントローラー側に無線で飛ばしてやる事も考えられるが、無線の遅延を考えるとあまり得策ではないだろうと考えた。 基本ボタンの状態だけを本体側は受信して、本体クロックにあわせて、本体にDATの信号を返すで動かす。完全に非同期。1秒に60回、16.6msec、本来の入力状態から遅延する事が考えられるが、m秒を争うゲームをする訳でもないので。 コントローラー(ゲームパッド)に向かって、本体からではなく、マイコンで生成したP/SとCLKの偽物データを送りつけて状態を読みとることをテストとして行う。 とは言え、16.6ms間隔でデータを生成したいので、これだけはTimerを使って時間をできるだけ正確にとることにする。 ESP8266TimerInterruptと先人の方々らライブラリーを用意してくれているのありがたく使う。 #include "ESP8266TimerInterrupt.h" #define PS_PIN 4  //D1 #define DAT_PIN 14   //D5 #define CLK_PIN 5 //D2 ESP8266Timer ITimer; void timertask () {   int status=0b 0 ;     digitalWrite (PS_PIN, HIGH);     delayMicroseconds ( 12 );     digitalWrite (PS_PIN, LOW);     delayMicroseconds ( 6 );     for ( int i= 0 ;i< 16 ;i++){     digitalWrite (CLK_PIN, LOW);     if ( digitalRead (DAT_PIN)==LOW){       bitWrite (status, 15 -...

スーパーファミコン コントローラーの無線化プロジェクト:ESP WiFi UDP

イメージ
(コントローラーの無線化にトライというだけでまだ出来ていませんのであしからず) 消費電力の観点からBLEがよさそうではあるが、WiFiのUDPでの2つのESPの間で通信をしてみる。基礎的な動作の確認。 サーバー側: #include <ESP8266WiFi.h> // WiFi #include <WiFiUDP.h>     // UDP // SSIDとパスワード const char *ssid = "esp8266" ; const char *password = "12345678" ; //create UDP instance static WiFiUDP udp; #define LOCAL_PORT   5000  // port number for local #define REMOTE_PORT 5000  // port number for remote IPAddress localIP; //local IP address IPAddress remoteIP;  // remote address void setup () {   Serial . begin ( 115200 );   delay ( 100 );     // AP setting   WiFi . mode (WIFI_AP);   WiFi . softAP (ssid, password);     delay ( 100 );   localIP = WiFi . softAPIP ();   Serial . println ();   Serial . print ( "AP IP address: " ); Serial . println (localIP);     // start udp   udp . begin (LOCAL_PORT);     delay ( 100 ); } void loop () {   char packetBu...

スーパーファミコン コントローラーの無線化プロジェクト:ESPからの制御

イメージ
 前回( https://funasover.blogspot.com/2025/03/blog-post.html )、SFCのコントローラーの仕様というのを確認したので、次のステップとしてEPSのマイコンを使って、信号をSFCに送り込む事を目指す。 P/SのシグナルをGPIO5に入力し、パルスの立ち上がえりを検出。割り込みを入れ、コントローターのボタンの押されている状態にあわせて、DATを出力する。 ESPを使っているので、3.3V系とSFCの5Vの電圧違いを吸収するために、レベルコンバーターを間に挟んでいる。 スケッチは、以下。 #define PS_READ_PIN 5 #define DAT_OUTPIN 4 unsigned int button_status; void onRising () {   //B Y SELECT  START 上 下 左 右 A X L R HHH   button_status = 0b 0101010101010000 ; //ボタンが押されていたら1   for ( int i = 0 ; i < 16 ; i++) {     if ( bitRead (button_status, 15 - i) == 0B 00 ) {       digitalWrite (DAT_OUTPIN, HIGH);     } else {       digitalWrite (DAT_OUTPIN, LOW);     }     if (i == 0 ) {       delayMicroseconds ( 17 );       for ( int i = 0 ; i < 2 ; i++) { asm ( " nop \n " ); };  // i<10 0.65usec     } else {       delayMicroseconds ( 10 );...

スーパーファミコン コントローラーの無線化プロジェクト:仕様確認(できるかはこれから)

イメージ
スーパーファミコンをジャンクで購入してきて、コンデンサを置換し修理。非常に古かったので色を塗りなおしたものを愛用。 そんなに遊ぶ訳ではないが、インテリア?として飾ってきた。たまに遊ぶ時に、コントローラーの線が短い・・・・。今時、無線化でしたいという欲求を満たそうというプロジェクトをやろうと一念発起。  なのでこの時点ではスーパーファミコンのコントローラーの無線化が実現できている訳ではないので、それを期待して見にきてくれた人は、ごめんなさい。これからです。 中古で購入してきたコントローラーの線を真ん中で切断。無線化が目的なので、躊躇なく切断 切断したケーブルにコネクタを圧着してつける。 ブレッドボードを使って信号をデジアナで確認する事を行った。 上からCLK, P/S, DATを表示していて、引いて観測すると16.6msec毎にP/SがLOWからHIHGに。60Hz間隔で、コントローターのボタンの状態を見に行っていることがわかる。 この一回を拡大すると以下のようになっていた。 P/SがまずLOWからHIHGになり12usec経過してLOW。その後、6usec経過してHIGHだったCLKがLOWになり以後16回H→Lを繰り返す。 上の場合は、赤い線はDATで、CLKがH→Lになるタイミングで前から、 B Y SELECT START 上 下 左 右 A X L R HHH となっているとのこと。 この場合、3回目にH→LになるときにDATがLOWになっているので、SELECTが押されている。 この場合は、CLKがH→Lになる5回目のタイミングと、10回目のタイミングでDATがHIGHからLOWになるので”上”と”X”が同時に押されている場合という事になる。 (実際に、上とXを押した状態でP/Sの立ち上がえりで、キャプチャーしているので正解。 パラレル→シリアルの仕組みというのは理解できた。 厄介なのは、結局1秒に60回つまり、コントローターのボタンがどう押されているかを読み取りに行っている訳だが、その割には、クロック間隔は6usecと結構短い。 無線で6usec以内に伝送を終えようとすると結構な速度が必要。一方で状態を読み取るのは 1秒に60回,16msecと結構間隔は長い。なので遅延は1回分ぐらいは致し方ないといったところ。 無線化のロードマップその1、動作を...

CH9329で日本語キーボード109で正しく表示する方法

イメージ
 CH9329を使う際は、 しごぶさんのCH9329のライブラリーをありがたく利用させていただいている。 https://github.com/shigobu/CH9329_Keyboard しかし、デフォルトのままでは、英語のUSキーボードの出力しかできない。正確には、ドイツ語やスペイン語といったキーボードの配列が入っているが、肝心な日本語キーボードが入っていない。 そこで、日本語キーボードへの対応をして、すべてのキーを入力できるようにする手順を残しておく事にする。 まず、ライブラリーのフォルダーに、KeyboardLayout_jp_JP.cppという名前のファイルを作成する。 中身は日本語のキーボードにあわせて以下にした。 /*  * Japanese keyboard layout.  */   #include "KeyboardLayout.h"   extern const uint8_t KeyboardLayout_jp_JP [ 128 ] PROGMEM =  {     0x00 ,        // NUL     0x00 ,        // SOH     0x00 ,        // STX     0x00 ,        // ETX     0x00 ,        // EOT     0x00 ,        // ENQ     0x00 ,        // ACK     0x00 ,        // BEL     0x2a ,        // BS   Backspa...

安価なHIDデバイス 3.3V ESP→CH9329→HID

イメージ
前回、ESP8266→ATMega32U4→HID→PCとキーボード入力のテストをした。 https://funasover.blogspot.com/2025/02/esp8266atmega32u4hidpc.html この欠点は、お手軽にできる反面、コストが高いってこと。ProMicro(leonardo )を一つ使うとフルのキーボードが作れてしまう、アマゾンで3つで2300円ぐらいなので、一つ750円。それに加えて5V系だと、ESPとレベルコンバーターを使う必要が出てくる。あと専有面積が結構大きくなるってことかな。 そこで、安価な方法を考えてみた・・結論はタイトルにあるCH9329にたどり着いた。 ① Attiny85 200円+V-USB、3.3V h ttps://akizukidenshi.com/catalog/g/g109574/ ②ATmega328PB 240円+水晶振動子(50円ぐらい)+V-USB  https://akizukidenshi.com/catalog/g/g118148/ ③CH9329 150円  https://akizukidenshi.com/catalog/g/g117539/ 結論は、①、②は手元に、ICがゴロゴロしているので最初に考えたが、なかなかこれら、難易度が高い!!がんばったがあきらめた。安価に、簡単な回路でというと③。 【①、②ダメな理由】 ① Attiny85 200円+V-USB、3.3V Attiny85は内部にPLLをもっているので16.5MHzをinternalで生成できる。これを使ったV-USBで、電源、GND、USBのD+、D-で4ピン、残りの2つをGPIOでソフトシリアルでピンの数も足りる、小さい!で3.3VでもV-USB動くか確認したら、動く!。外部振動子なしで3.3Vで作ったら、D+、D-の電圧を下げるのに使う、ツェナーダイオードも不要で抵抗を挟むだけじゃん!コンパクト、回路も簡単!そして、個別にAttiny85でソフトシリアルもテストで動く事は確認。 こりゃもらった。と思ったらこれが動かない。 問題は、ライブラリーのkeyboardとSofeSerialが共存できない!! multiple definition of `__vector_2' といったよ...

ESP8266→ATMega32U4→HID→PC

イメージ
ESPからソフトウェアシリアルで、文字列を送信 文字列を受けっとったATMega32U4は、HIDのキーボードとして、受け取った文字列をPCにキーボード入力するテスト 目的は、最終的には、Androidタブレットが起点として画面のボタンを押すと、ESPにWifiで文字列が飛んで、その文字列が自動でキー入力されるというものをつくりたいので。 過去には、Attiny85を使って https://funasover.blogspot.com/2024/06/attiny85-4key-keyboard_23.html 押したボタンで自動にパスワードやメールアドレスが入力できるミニキーボードを作っていたがそれをAndroidのボタンタップを起点として実現したい。 ESPは3.3Vで手元にあったATMega32U4(Pro micro)は5Vのため、シリアルのラインにはレベルコンバータを使っている。自作という訳ではなくて、昔購入していたものを使っている。 同じものだと https://www.amazon.co.jp/gp/product/B081RH1P4L/ref=ox_sc_act_title_1?smid=A3IR3W7NI10CEW&psc=1 とか。 ソフトシリアル通信は、WEBで調べればサクッとできるが、メモを残しておきたい。 ESP8266は、Arduinoのソフトシリアルがそのまま動くので、特にESPだからという配慮はいらない。ピンの配置ぐらい。 #include <SoftwareSerial.h> SoftwareSerial mySerial ( 12 , 13 );  // RX,TX=12,13 void setup () {   // put your setup code here, to run once:   mySerial . begin ( 9600 );        // ソフトウェアシリアル通信の開始(ボーレート9600bps)   pinMode ( 16 , OUTPUT); } void loop () {   // put your main code here, to run repeatedly: m...

【android】USBセレクターの制御 ~wifi経由~

イメージ
 inkscapeを使って、ボタンのデザイン(( ..)φ)カキカキ 久々に触るのとバージョンがかなり前0.9台から1.4にしたこともあって、事前にクマを書いてしまった(チュートリアルをさらりとやって基本の操作を再度勉強)・・・ https://inkscape.eksd.jp/ それなりにかっこいい?ボタンの画像イメージを作ってみた。PC1とPC2の2種類。 作成したファイルをPNGで保存。buttonpc1.pngとbuttonpc2.pngのファイル名で保存。 Android studioのimagebuttonの画像に割り当ててみる。新規プロジェクトを起こして、buttonpc1.pngとbuttonpc2.pn のファイルをdrawableのフォルダーの下に移動させる。 その後、acrivity_main.xmlを編集、imagebuttonを2つ配置。 drawableにコピーした画像を割り当てる。普通に割り当てると、グレーの枠がついてしまう。 この背景を透明にしてやると、思い通りにはなるものの、一つ課題が、それはクリック感がなくなってしまう。 OC techNoteさんのHP に解決法があったので使わせていただく。 drawableのフォルダーに、image_button_bg.xmlをつくり <? xml version ="1.0" encoding ="utf-8" ?> <selector xmlns: android ="http://schemas.android.com/apk/res/android" > <item android :state_pressed ="true" android :drawable ="@color/black" /> </selector> を記述する。 各ボタンのbuckgoundにこのxmlファイルを指定してあげるとクリックしたときに一瞬バックグランドの色が変わる。画像を用意しておいて、それに入れ替えてもOKなはず。まずまずは簡単なバックグランドの色を変更で。 最初は、有線接続でいいや!と思っていたのでusb-serial-for...