![見出し画像](https://assets.st-note.com/production/uploads/images/89892118/rectangle_large_type_2_ddcfacda55f8d6b60cc1bea32890b207.jpeg?width=1200)
Apple II ▷ ジョイスティック(5)
Arduinoスケッチについて
Arduinoによるデジタルポテンショメータの制御については以下のサイトを参考にしています.メーカーや愛好家たちのサイトでサンプルスケッチが丁寧な説明付きで公開されているのでとても勉強になります.そしてぼくがこうして記事を書くのも,記録として残しておくとなにかしらの参考になるかもしれないという思いがあるからです.
ジョイスティックの動作チェックにはapple IIの"MECC-A240 Computer Inspector"というソフトを用いました.これは Apple IIの動作を全般的に確認することができるソフトです.そのなかに"Joystick/Paddel Test"という項目があり,その名のとおりジョイスティックとゲームパドルの動作確認ができます.
この段になって判明したですが,X軸の座標が反転していました.予備実験をしていたにもかかわらず,ジョイスティックの2軸の正負とApple IIの画面の座標系を対応づけていませんでした(正確にいうと,2軸とも反転していて,Y軸方向は画面座標でただしく,X軸が反転しています).そこで,現場あわせすることにしました.スケッチを見ればわかるように,
val_LR = 255-analogRead(value_LR)/4;
と辻褄をあわせています.プログラムでこうした修正ができることはとても助かります.
// Apple II Joystick
#include <SPI.h>
int CSx= 9;
int CSy= 10;
// 2-axis joystick
const int value_LR = A0;
const int value_UD = A1;
float val_LR = 0;
float val_UD = 0;
// Digital Potentiometer
byte address = 0x11;
void setup() {
Serial.begin(19200);
// digital potentiometer ---------------------
pinMode (CSx, OUTPUT);
pinMode (CSy, OUTPUT);
SPI.begin();
}
void loop() {
// val_LR = analogRead(value_LR)/4;
val_LR = 255-analogRead(value_LR)/4;
val_UD = analogRead(value_UD)/4;
// X-axis ---------------------
digitalPotWriteX(val_LR);
delay(5);
// Y-axis ---------------------
digitalPotWriteY(val_UD);
delay(5);
}
// Digital Potntiometer ---------------------
int digitalPotWriteX(int valueX)
{
digitalWrite(CSx, LOW);
SPI.transfer(address);
SPI.transfer(valueX);
digitalWrite(CSx, HIGH);
}
int digitalPotWriteY(int valueY)
{
digitalWrite(CSy, LOW);
SPI.transfer(address);
SPI.transfer(valueY);
digitalWrite(CSy, HIGH);
}
余談
ぼくがArduinoやRaspberry Piを実際に手にとって実験・工作するようになったのはごく最近のことです.その存在は以前より知っていましたが,Apple IIをレストアしてあれこれ実験・工作するようなり,初めて手にとりました.
いっぽう情報可視化でProcessningを使っていたことがあり,スケッチをとりあえず読むことはできたので,ハードルはそれほど高くはなかったかもしれません.
40年も前の8ビットマシンであるApple IIがこうしたデバイスを介して現代にリンクできることが愉快でたまりません.
▷ 訂正(2022年11月15日)
スケッチの一部が欠落していました.以下を追記しています.この記述がないと動きません・・・
// X-axis ---------------------
digitalPotWriteX(val_LR);
delay(5);
// Y-axis ---------------------
digitalPotWriteY(val_UD);
delay(5);