10秒ゲーム

2023年12月 7日 (木)

Arduinoで「ボコスカハンマー」 あれれれれっ?!

ボコスカハンマー」を作ってと依頼がありました。
   ・10秒ゲーム
ベースはArduino UNO R3ですが、ブートローダーを
書いたATmega328Pチップ(28pin DIP)をユニバーサル基板
に乗っけて製作します。
配線を終えて、チップにスケッチを書いたら・・・
ありゃま。 テレビに出る画像に異常がぁ!

このタイトル画面が
Bk21
これ↓に
Bk11

スタート待機画面が
Bk22
これに
Bk12

現在のところ、原因不明。
現用しているビコピコやシャカシャカからチップ抜いて、
今回作った手組み回路に突っ込んだらちゃんと動くので、
配線や使った部品に起因するものではありません。

原因の推定
 ・Arduinoのコンパイル環境が変わって最適化などの
  状態が前と変わってしまったのか。
 ・今回使ったATmega328P、その内部が前のと
  違うのか。(まさか)
     ※パチモンの可能性

ジャギジャギになっている表示そのものは安定して
いるのです。
チラチラはしてません。
Arduinoの環境を昔のに戻すのはちょっとかなわんし。

sleepさせてH-SYNCサイクルでの割り込みを待って
表示という処理を流しています。
チラチラしないということは、どこかで安定した
時間待ちが出ているもよう。

はてさて・・・困ったぞ。

 

※わかったぞ!
 やっぱりコンパイル環境による最適化の違いでした。

水平走査、1ラインを描画出力しているのはこんな処理です。

void v1line(void)
{
byte i;
uint32_t d; // 32bitデータにコピー
d = sft_bff.sft; // シフトデータ
for(i = 0; i < 32; i++){ // 32bit
if(d & 0x80000000){ // MSB 0/1 ?
VSIG_H; // H出力
nop(); nop(); nop(); // wait
nop(); nop(); nop(); ★1
nop();
}
else{
VSIG_L; // L出力
nop(); nop(); nop(); // wait
nop(); nop(); nop(); ★2
nop();
nop();
}
d <<= 1; // 左シフト ★3
}
nop(); nop(); nop(); nop(); // wait
VSIG_L; // L出力で終わる
}

画面を光らせるのはVSIG_H
消すのはVSIG_L
SBI、CBI命令でポートを直接叩いています。
そして、タイミングの調整に「nop」命令を並べています。

H出力の時【★1】はnopを7個実行して、32bit描画データの
左シフト処理【★3】に飛びます。

そしてそして・・・
コンパイラの最適化がすごいのがL出力の時。
VSIG_Lの実行後、その下に記してあるnop命令8個【★2】
は、数を合わせればVSIG_Hのところにあるnopを使ったら
エエやんということで、VSIG_H直後のnopの場所に飛んで
いるのです。
   ※この飛ぶためのjmp命令の分、L処理時間が
    延びてしまった。
【★2】のnop命令は1つだけを残して実行プログラムの中から
抜いてしまっていて、存在していませんでした。
それでもシフト処理に来ますんで、流れは間違っていません。

絵がおかしくなってしまったのは、nopの数合わせはした
けど、描画のタイミングが白黒でズレてしまったというのが
原因でした。


| | コメント (0)

2023年5月29日 (月)

ひさしぶりの地域イベント

昨日はひさしぶりの地域イベント。
自作の10秒ゲームツールの出番でした。
 ・ボコスカハンマー
 ・ピコピコスイッチ
 ・シャカシャカホイップ
それぞれ2台が出動。
子ども達など大勢の皆さまにいじめられました。

それぞれの最高点(画面下側のHi表示)を記録しておきます。

 ・ボコスカハンマー : 145点
Cc13_20230529095801

 ・ピコピコスイッチ : 159点
Cc11_20230529095801

 ・シャカシャカホイップ : 155点
Cc12_20230529095801

10秒間で得た衝撃パルスやスイッチの押し下げが
得点ですので、毎秒14発や15発の速度となります。

トラブルもありました。
 ・イベント終了直前、ピコピコスイッチ1台の右側のスイッチ
  が接触不良になってアウトに。
    このスイッチ、押されるというより、おもいっきり
    ドツかれていますんで。
    「やさしく扱って」との申し出は無意味ですんで。
 ・ボコスカハンマーの映像出力用RCAピンジャック(黄色)の
  接触状態が悪化して映像が不安定に。

 
※ボコスカハンマーのRCAピンジャック
修理のため、ジャックをパネルから外そうとすると・・・
黄色の樹脂部で断裂してしまいました。

Cc21_20230529101301
Cc22
組み立ての時、固定ナットをきつく締めすぎていたのか・・・

2系統のビデオ出力を持っている回路だったので、
イベント中はもう一つの方につなぎ直して続行でき
ました。

「マル信無線電機」の「MR-599」というジャックです。
Cc23

日本橋テクノベースの店頭では「MR-565」 シリーズの
ジャックが並んでいますが、これの場合、GNDにつながる
「ベロ」がネジ止め時、いっしょに回ってしまい、もう一つ
使い勝手が良くありません。
Cc24
そこで「MR-599」あるいは「MR-699」なんです。
MR-599とMR-699、微妙に構造が違っていてMR-699の
ほうはGND端子も完全に絶縁できるようになっています。
今回のトラブルはMR-599のほう。
MR-599の固定ナットは9mm。
MR-699は10mm。
パネル加工の穴径も異なります。

Cc25

部品箱にMR-699のストックがあったので交換しました。
Cc26

MR-599は固定ナットにGND端子が接触して、
ケースが金属だとそこで接触。
MR-699は完全に樹脂が覆っていてケースのGNDと
分離できます。

※ピコピコスイッチ
スイッチがアウトになったのかと思ってスイッチボックスを
バラしたら・・・ 接続線の断線でした。
コントローラとのつなぎにLANケーブルを使ったんで、
より線じゃなく単線。
単線をスイッチ端子にハンダした根元で切れてました。
スイッチの振動に負けたようです。

LANケーブルの単線の先により線をハンダして
ちょっと延長。
スイッチ端子にはより線をハンダしておきました。

「ピコピコ・スイッチ」破損
「ピコピコ・スイッチ」操作スイッチ部を新造

| | コメント (0)

2022年2月18日 (金)

「シャカシャカ・ホイップ」衝撃検出回路

圧電発音体(ピエゾ・スピーカー)を衝撃(振動)センサーに
した時の検出回路、トランジシタ1つだと回路は簡単ですが
振動波形のうねりによりチャタリングでミスカウントする
ことがあります。

パルス検出プログラムが、V-sync(60Hz)のタイミングで
動いているので、ソフト的なチャタリング除去がもうひとつ
うまくいきません。
きちんと波形を捉えて、1発パルスにしておきたいという
ことで、LM393を使ってヒステリシスを持ったコンパレータ
回路を使うことにしました。

この時のヒステリシスの考え方を図示しておきます。
検出回路の全体図

Ss2

比較電圧はコンパレータ部の(+)端子、非反転入力です。
この電圧を抵抗値から計算します。
H11_20220218113501
このように抵抗がつながって、+端子の電圧が出力のHとLで
変化してヒステリシスが生まれるのです。

さて、トランジシタを使ったシュミット回路、あれこれ
ありますがどうしても入力インピーダンスが低くなって
しまいます。
比較電圧の基となるのがTrのベース・エミッタ間電圧です。
温度変化もあるし・・・

代表例を示しておきます。

H12

そんな中、0~5Vや0~12Vを検出するのに役立つのが、
RS-232C用レシーバーIC。
代表品番が75189と75189A。
14ピンにこんな回路が4つ入っています。

H13
189と189AでR1の値が違っていてヒステリシス電圧が
異なります。
H14
  (TIのデータシートより)

今は、シュミットICといえばC-MOSの4584やHC14で、
入力インピーダンスが高いので、時間遅延などの用途
では時定数の抵抗を大きくできます。
ただ、ヒステリシス幅や検出電圧が自由に設計できません。

※「シャカシャカ・ホイップ」 最終(ほぼ)回路
6

これで、衝撃センサーを使った10秒ゲームが同じ
ソフト・ハードで動きます。
「ボコスカ」「シャカシャカ」「炎のターゲット」の3種
はこれでOK。

※バックアップがわりに現在のスケッチ
   ・ダウンロード - piko_boko1b.zip

※Arduino UNOでとりあえず動かしてみるつなぎ方
C001_20220211151001

スタートしてINT0にパルスを入れると得点が上がります。
「ピコピコ」の場合はINT0とINT1交互に入力。
A4、A5にテスト用のパルスを出力してますので、これを
INT0(ピコピコならINT1にも)につなげば得点パルスに
なります。
  ※計測中にSTART SWを押すと、このパルス周期が
   変わりますので、得点が進む速さが変わります。

■画面の様子 横32dot × 24line
・ゲームのタイトル表示
   ----    ----
  | シャカシャカ |  |ピコピコ|
  |ホイップ|  |スイッチ|
   ----    ----
   ----    ----    ----
  |ボコスカ|  | 炎の |  |ぱたぱた|
  |ハンマー|  | ターゲット |  |プロペラ|
   ----    ----    ----
・合格点とゲーム時間表示(起動時)
   ----
  |100合|
  | 10秒|
   ----
・開始、秒読み、カウント
   ----    ----    ----
  | よ~い |  | それ~ |  | 23 |
  |321 |  |■■■■|  |■■  |
   ----    ----    ----
               10秒の残時間バーが減少
      最初のパルス入力が来るまで計時しない。
      パルス無し2秒が続いたら計時開始。      
・結果表示
   ----    ----    ----
  | 89×|  |123Hi|  |102ok|
  |ざんねん|  | ハイスコア |  | 合格 |
   ----    ----    ----
   合格点=0の時は合格表示はしない。
・スタンバイ、スタート待ち
   ---- 
  |123Hi| ←新ハイスコア Hi点滅
  |119Hi| ←旧ハイスコア 次ゲーム開始で新に更新
   ---- 
・モードスイッチ操作
   ----    ----    ---- 
  | Select |  | Select |  | Select |
  | ゲーム |  | 合格点 |  | チャタリング| 設定項目を選ぶ
   ----    ----    ---- 
・ゲーム種別設定
   ---- 
  | ゲーム |
  |ピコピコ| ←5種から選択
   ---- 
・合格点設定
   ---- 
  | 合格点 |
  | 10点| ←0~150まで10点ピッチで設定
   ---- 
・チャタリング除去処理の有無を設定
   ----    ---- 
  | チャタリング|  | チャタリング|
  | なし  |  |あり:1c |
   ----    ---- 


※ビデオ出力回路
Bb1_20220218163101
なぜトランジシタでバッファしているのかと
出力にコンデンサをいれている理由の説明。
Bb2_20220218163101
「大声」と「ボコスカ」でビデオ出力を2系統に
して作ったのがあります。
競技者が見るテレビと観客が見るテレビ(例えばプロジェクタ)
を別に置くとき回路の分岐が便利だから。

| | コメント (0)

2022年2月11日 (金)

『炎のターゲット』は2003年夏のイベントで使いました

ピエゾスピーカー(圧電発音体)を衝撃(振動)センサーとして使った
10秒ゲーム」の一つ、『炎のターゲット』は2003年のイベントに
登場していました。
その写真を発掘しました。

ターゲットには「あててみな!!」のメッセージ。
Aa0
寝てる人は気にしないように。
テントや盆踊りやぐらの設置などで疲れて・・・
   ・・・故 愛宕先輩・・・合掌。

撃ったBB弾を回収して銃に装填しなくちゃなりません。
これに人手が必要。
この作業がネックになり、これ1回かぎりでおしまいに。

ゲーム中の様子。
Aa1_20220211214701
子供たちには大人気。
「10秒間」という時間制限でどれだけ命中させられるのか、
手に取った「銃」の性能(弾道はけっこうエエかげん)を
時間内でどれだけ補正できるのか、大人がやっても面白い。

今回の「シャカシャカ・ホイップ」のArduino UNO化で
復活もありかなぁ。
センサーをどうするかだけの問題ですんで、「シャカシャカ」も
「炎のターゲット」に変身できます。

| | コメント (0)

2022年2月10日 (木)

「シャカシャカ・ホイップ」回路はこれで決定か。

圧電発音体(ピエゾ・スピーカー)を振動(衝撃)センサーとして使った
「10秒ゲーム」、過去あれこれ作ってきました。

今回のタイトルは「シャカシャカ・ホイップ」。
その制御プログラムをArduino UNOのATmega328Pにまとめよう
ということで、あれこれ試行錯誤しております。

過去に作った10秒ゲームのタイトル。
   ※写真はそのうち発掘します。

・「ボコスカ・ハンマー
・「ピコピコ・スイッチ
  現役で大人気品。 学校でのイベントゲームの主役。

・「炎のターゲット
 銀玉鉄砲でBB弾を撃ち、マトに当てるというゲーム。
 マトの裏にセンサーを貼り付けてアタリを検知。
 子供達に大人気だったが、BB弾の回収がうまくいかず。
 (回りにビニールシート張り、傾斜させて丸いBB弾が
  勝手に集まるようにしてみたが・・・手間がかかる)
 1回限りの出動でおしまい。

・「ぱたぱた・プロペラ
 ウチワでプロペラをあおいで、10秒間で何回転できるかを競う。
 子供達、むちゃはまる。
 残念ながら屋内用。
 屋外だと、風が出てきたらプロペラが勝手に回ってゲームにならない。

・「やかまし・チューブ
 透明の筒の底にセンサーを貼り付けてある。
 筒を上下に振り、中に入れた小ゴムボールの衝突回数を競う。
 ムキになる。
 センサーからリード線が出ているのでブラブラしてじゃま。
 無線化できればと。

・「びんぼう・ゆすっち
 両端にスイッチを取り付けた筒を、膝ではさみこみスイッチを
 びんぼうゆすりでon/off。
 派手さが無いのであんまし。

今回のArduino スケッチ、これらのゲームに対応できるように
してみました。
  (ハードはそれぞれ合ったインターフェースが必要)

表示と音出しはテレビに。
  使わなくなった地デジ未対応のブラウン管テレビ、
  これらのゲームのために学校倉庫に置いてあります。

「シャカシャカ・ホイップ」の回路、こんな感じでまとめました。
4

ピエゾスピーカーからの信号をトランジスタで受けて
モノマルチで一定幅のパルスに。
それをINT0入力(↓エッジ検出)で数えます。
オペアンプやコンパレータは使わず、こうするほうが
シンプルに。

衝撃センサー1つだけの「ボコスカ」や「炎の」「やかまし」、
今回の「シャカシャカ」がこれで対応できるでしょう。

「ピコピコ」はスイッチ2つの入力になります。

「ぱたぱた」はプロペラの回転を検知するのに光電センサーを
使っています。
「ぱたぱた」の場合、速度が速いので(他のゲームは60Hzで入力を
サンプリング)、H-syncのタイミングで入力パルスをカウントする
処理にしています。

「mode SW」でゲームの種類(タイトル表示)と「合格点」を
設定できるようにしました。 (設定をEEPROMに保存)

バックアップがわりにスケッチを。
   ・ダウンロード - piko_boko1.zip


ユニバーサル基板の様子。
A11_20220210103501

ケースは百均屋さんで買った密閉容器。
フタを下にしてるんで、基板の固定はペッタンを貼り付けて
ラッピング線を基板端の穴に通して仮止め。
動き回らなかったらOKということで。
A12_20220210103701
A13_20220210103701

「いんじゃんマシン」 も裏を開放しているんで、制御回路が見えます。
そうすると興味を持ってくれる子供が出てくるんで、面白いです。

2019年7月18日 :いんじゃんマシンの電源がアウトに!

※電源電圧と消費電流
  3.0V 39.5mA
  2.8V 42.4mA
  2.6V 45.9mA
  2.4V 50.1mA
  2.2V 54.4mA
  2.0V 59.8mA
  1.8V 65.6mA
  1.6V 74.5mA


※またまた入力部の回路変更

衝撃センサー波形(圧電発音体)を、ダイオードでリミットせず、
そのままショットキダイオードで整流して直流にして、
それをTrのベースに入れるとどうなるかを試してみました。
  ※モノマルチICを省けないかと
うまいこと行きそうです。
B11_20220211092801
モノマルチも残したまま回路を変更。
5

※新しい入力回路で取り込んだ信号波形
B000_20220211100501

B002_20220211100501

B004_20220211100501

B005_20220211100501

力強く泡立て器をボウルの壁面に当ててもらえれば
ミスカウントはほとんどありません。

「シャカシャカ」(ン? カシャカシャか?)
して、摺るような操作が入った時の信号検出が
微妙です。
得点してしまうのもちょっとなぁだし。
チャタリング除去、↓パルスが来てから1V-sync間のは
「無視」という処理です。
2パルス連続したときはもう1sync伸ばすという処理です
かなぁ。

※テスト回路
簡単には、この接続でスケッチを動かしてもらえます。
C001_20220211151001
A4とA5にテストパルスを出してますんで、それを
INT0あるいはINT1につなげれば、外からの信号が
無くても動作を見ることができます。


※さらに追記 : 衝撃検出回路、コンパレータで

NPNトランジスタ1つで検知する回路、簡単で良いのですが
信号のオフ・スロープに不安が残ります。

整流後の電圧がTrのベース電圧を越えるとオン。
   (これは一瞬)
そして徐々に電圧が下がってオフ。
このオフする時にヒステリシスが無いので、場合に
よっては振動波形(チャタリングですな)が生じます。

それを避けたいな~っと、コンパレレータ LM393を使って
描いてみたのがこんな回路です。

A11_20220216171601  
まず、整流回路にダイオード1コの電圧リミッタを挿入。
最大が0.6Vくらい。
そして、前段のコンパレータがオンする電圧が0.5V。
Vfより低くしておきます。
オンしてからオフする電圧が0.25V。
この差がヒステリシス。
整流波に「脈」があっても、それが出力に出るのをこの
電圧差で回避するわけです。
8ピンの安価なICです。
抵抗が数が増えますが、安定動作を目指すなら、これかなぁ。

こんな波形が得られます。
Bb002_20220215175501
2つの山、後ろ側のレベルの小さなほうは出力に
現れません。

| | コメント (0)

2022年2月 5日 (土)

「シャカシャカ・ホイップ」完成が近づいてきた

こんなボウルを使っています。
S22_20220205173801

ボウルの外側にセンサー(圧電発音体)を1つくっつけています。
こんな様子。
S23
ホットボンド+M2のビスで固定。

女房の友人に試運転してもらいましたが、私ら(男連中)
より得点が上がりました。
「しなやかに泡立て器を振り回す」のが良いようです。

我々は、張り切ってしまって、力任せになっちゃいます。
それがスピードを阻害しているようです。
140点あたりがハイスコア。
ゲーム性、ねらいどうりの感じです。

| | コメント (1)

2022年2月 4日 (金)

「シャカシャカ・ホイップ」予備実験 #5

ざっと制御スケッチはできたんですが、
ボウルと泡立て器が接触したことを検知するセンサー
をどうしたものかと悩み中です。

センサーとして使うのは圧電発音体。
図の左側のように、1つだけ使い、ボウルの左右に衝突する
泡立て器による振動を捉えようと考えていたのです。

S1_20220204125701
しかし、角度で90度離れた所に置いたセンサーへ来る信号が
ちょいと弱いのです。

こんな回路を考えていました。

S2_20220204125801
「ボコスカ」のように衝撃が単純で強いとトランジスタ
1つで安定にピックアップできました。

S3

こんな回路にしてもちょい不安定。
S4
ボウルの左右、衝突点にセンサーを2つ設ければ
ボコスカと同じ簡易型の回路で大丈夫そうなんですが、
強く打ち付けたとき、反対側の衝突も拾ってしまうと
いうことになり、感度合わせがなかなかやっかい。
センサーが2つだとケーブルの引き回しも面倒だし。

そこで、センサーは1つにして、前段アンプを設ける
ことにしました。
S5
増幅とコンパレートに8ピンのオペアンプ1つという
ことで回路をまとめてみます。

調整カ所は2つ。
増幅ゲインとコンパレート・レベルを半固定ボリュームで。

| | コメント (0)

2022年1月28日 (金)

「シャカシャカ・ホイップ」予備実験 #4

ピコピコ・スイッチ
ボコスカ・ハンマー
シャカシャカ・ホイップ(まだ未完成)
この3ゲームをArduino-UNOで制御という試み、ざっと
できたのですが、「画面表示の割り込み元」を変えました。

『ピコピコ・スイッチ』、Arduino-UNOで動くように
で紹介しましたスケッチでは、
ATmega328Pの「タイマー1」で映像信号のタイミングを
作っていました。
それを「タイマー0」に変えたのです。
タイマー1は16bitなんでで発生させる周波数(周期)をこまかく
設定できます。
それを「音」の発生に使いたかったのです。

Arduino-UNOでは、タイマー0をシステムで使っています。
  (delayやmillisなど)
それを取り上げて、映像信号の発生に使います。
このためdelay、millisは使えなくなります。

もう一つの8bitタイマーであるタイマー2、このOC2B出力が、
INT1入力(エッジパルス入力)と重なっているのです。
タイマー0やタイマー2のPWMで周期を設定したいときは
OCR-Aレジスタで繰り返し周期を設定します。
   通常のPWM出力(analogwrite)はTOP値=0xFFの
   PWM動作モードが使われます。
   このモードでは周期の微調はできません。
すると、PWM出力の制御はOCR-Bレジスタですることになり、
OC-B出力を使うことになります。
INT1入力を使いたい(ピコピコの二つのスイッチ入力)ので、
タイマー2のOC2B出力は利用できません。

ということで、タイマー0のOC0Bを、映像の同期信号出力と
して使うことにしたのです。
ピンが変わるので、回路図も変更です。

※参考
2020年1月28日:Arduinoから「タイマー0」を取り上げる(ユーザーが使う)

| | コメント (0)

2022年1月26日 (水)

「シャカシャカ・ホイップ」予備実験 #3

圧電素子の出力を見るのに、シャカシャカしてたら
泡立て器のループ(5ループある)が1本、外れてしまいました。
41_20220126120201
折れた根元の様子。
42_20220126120201
抜けただけのように見えますが・・・
43_20220126120401
これを見ると、「抜けた」んじゃなく内部で溶接かなにか
で固定していた部分が破断したのかと。

「ボウル」ですが、金属製のよりプラ製のほうが素直な
波形が出てきます。
金属製のボウルだと、泡立て器を衝突させる場所で、
取り込む波形に振動が出たりと、安定しません。

センサーはこれが良い感じ。
44_20220126120601
むき出しの圧電振動板。 直径20mm。

その信号を、こんな回路でとらえてみました。
46_20220126120701
二つのシリコンダイオードで波形振幅を制限。
その後、ショットキーダイオードで倍圧整流して
みました。

出てきた波形。
45_20220126120801
「0.3V」あたりでコンパレートすれば、きれいに
信号を拾えそうです。


| | コメント (0)

2022年1月24日 (月)

「シャカシャカ・ホイップ」予備実験 #2

ボウルの側面に「振動センサーがわりの圧電発音体」を
くっつけてシャカシャカしてみました。

21_20220124090601
負荷抵抗を10kΩにしてシャカシャカした波形です。
泡立て器を当てる位置により信号レベルが変わります。

E000
E001

波形をFFTしてみると、6kHzあたりにピークが見えました。
  (横軸1divが10kHz)
E002

さて、信号検出どうしたものか。
ボコスカはTrのBE間電圧を使って簡単にしました。
波形の余韻を見ると、コンパレータでスパッとレベルを
判断したいところかと。

| | コメント (0)