de IBY

めざせ知識の無駄遣い

Vivado 2021.1インストール覚え書き@Ubuntu 20.04

追記!!!

気が付いたら公式が対応していたようです.最初にlibtinfoをインストールしていれば全て解決するとのこと.何だったんだ…

https://support.xilinx.com/s/article/76616?language=ja

というわけで,以下の話は昔の話ということで……

Ubuntu 20.04 64ビット環境にVivado 2021.1(執筆時の最新版)をインストールしました.インストール中いろいろ紆余曲折があり,まとまった記事が無かったので記録に残そうと思います.

注意

この記事はLinux素人がインストールできた喜びから深夜テンションで書いた文章です.いろいろ抜けている箇所あると思うので,参考程度にしてください,,,

続きを読む

Logiris - ロジックアナライザでテトリスを遊ぶ

訳わからないタイトルですが,百聞は一見に如かず,ぜひ動画を見てください.

 

作るきっかけ

昨年 12 月,某所でジャンクのロジックアナライザを発見し,回収しました.ロジックアナライザとはオシロスコープのデジタル版のようなもので,各測定点におけるロジック(High,Low)が時間の経過とともにどのように変化するかを記録することのできる装置です.回収した状態ではプローブがなかったものの,ちょっと手を加えて動作チェックしたところ,古いものとはいえ正常に動作するようでした.ここで,動作チェックのために矩形波を入力していたところ,ロジックの切り替わりがドット絵のように見えてきたので,ここから「矩形波をうまく切り替えることでドット絵を描画できるのではないか」と考え,今回のアイディアが浮かびました.

f:id:ibv:20210328133024j:plain

回収したロジックアナライザ(HP 54620A).94年製ということで私より年上です.端子を挿す場所とチャンネルを対応付けるためにテープを貼りました.

描画の仕組み

ロジックアナライザの描画はオシロスコープとほぼ同じで,16 個の信号の中から記録を開始するきっかけ(トリガー)とする信号を選んで,その信号がトリガーを引き次第順次全てのチャンネルの信号のHi/Lowが記録されていきます.描画中は,信号の電圧がある値よりも大きければHi,低ければ Low を出します.この仕組みを使って,CH0(一番上)の信号をトリガーとして,一定時間Hi/Low を描画→一瞬 Low →再び Hi/Low にする...ということを16チャンネルで同時に行い,うまくやればドットを描画できるのではと考えました.結果として下のようなドット絵(?)をまず作ることができました.一行に16 個ドットが収まりそうだったので,16 チャンネル ×16 ドット=256 ビットの情報があれば描画データを管理できそうです.今回は uint16_t 型の長さ 16 の配列を用意して管理しました.

 

f:id:ibv:20210328145355p:plain

タイトル画面を描画してみた.LOGIRIS と書いたつもり.

ゲームを実装する

ドット絵を表示するだけだとつまらないと思い,ドットを使って簡単に実装できそうなものとしてテトリスを思い浮かべ,これを実装しようと考えました.
PIC16F887に PICKIT4 を用いてプログラムを書き込みました.下に簡略化したフローチャートを示します.図中の「画面反映」が,配列で管理されている描画データを実際にロジックアナライザの画面に描画する作業です.

f:id:ibv:20210328143002p:plain

実際には移動・回転処理の前に移動できるかチェックするフェーズがあります.

あれ?もはやテトリスだけのフローチャートじゃね?

 

コントローラからの入力は,昔の工作で使って放置されていたファミコンのIコンから取得しています.これを参考にしました.

 

ハードウェアに関しては,マイコン本体+パスコン,配線,コントローラと繋がるDINコネクタ以上に必要なものはありません.マイコンスゴイ.

実演

 動画を撮影してTwitterにあげてみました.ぜひご覧ください:

 

反省点として,コントローラの割り込み処理をうまく書くことができず,タイミングよくボタンを押さないと反応しないことがあります.常にコントローラ入力を受け付けるためには押されたボタンの取得を常に行う(=常に割り込みを行う)必要がある一方で,テトリミノを下げる処理で0.5秒毎の割り込みを使っているため,このタイミングでないと入力を受け付けられないというわけです.ちょっと工夫したら解決できそうです.

 

あと余裕があれば基板に落としてコンパクトにまとめたいですね.

 

というわけで,まだ課題が残るもののロジックアナライザでドットを描画して,テトリスを遊ぶことができました.今後とも役に立たない工作をしていきたいです.ここまで読んでいただきありがとうございました.

 

<追記>

HPのエンジニアはやはり同じようなことを既に考えついていたようだ.嗚呼:

togetter.com

Arduino製EEPROMライタ『MEEPROMMER』を作った

今やっている工作でEEPROMを使う必要があるため,EEPROMライタについて調べました.

 

軽く検索をかけたところ,中華製のライタがほとんどで,値段も平均して8000円と結構高めな印象.

 使いたいEEPROMは今のところ一種類(28Cシリーズ)だけなので,わざわざ高性能なものを揃える必要はないと思い,PICKIT4とかを使ったものとか何かないものかと調べていたところ,Arduinoを使って28Cシリーズのライタを自作したというフォーラムを発見しました。

forum.6502.org

 

MEEPROMMERと名付けられたこのライタ,検索したところ日本語で書かれた紹介記事を見つけることができなかったので,記事に残しておくことにしました.同じように安価な28CシリーズのEEPROMライタを探している人の助けになれば幸いです.

 

記事を頼りに必要な部品を揃えましょう.ほとんどの処理をArduino氏がやってくれるのでハードウェアは少なめです:

  • EEPROM
  • Arduino
  • 74HC595×2
  • ゼロプレッシャーソケット(28Pin,600mil)
  • パスコン×3
EEPROM

今回は28C256を使いました.DigiKeyにあったので,マルツに取り寄せてもらいました.

Arduino

フォーラムではArduino Nanoを使っていましたが,ピンアサインがだいたい同じなので手持ちのUnoを使いました.

74HC595

8ビットシフトレジスタ.データバス+アドレスバスがArduinoのピン数よりも多いので,入力を増やすために使います.秋月で買いました.パスコンは0.1uFです.

ゼロプレッシャーソケット

手持ちのものを使いましたが,まだ千石にあると思います.

 

部品を集めたら回路を組みましょう.MEEPROMMERで必要となる情報(ソフトウェアも)はすべてGitHubにまとまっているので,こちらの Hardware 内に回路図があります.配線のミスに気を付けて気合で組んでいきましょう.

f:id:ibv:20210316180215j:plain

簡易的にブレッドボードに実装しましたが,ArduinoシールドっぽくしたeagleデータもGitHubにアップロードされています.

 

ハードウェアを組んだら,ソフトウェア側の環境を構築しましょう.GitHubリポジトリ内にある「MEEPROMMER.jar」が実行ファイルです.が,このソフトウェアを動作させるためにはシリアル通信のJavaライブラリであるRXTX Libraryを入れる必要があります.Windowsの場合はこちらを参考にしましょう.*1

 

環境構築をして,GUIが表示されたらあとはArduinoスケッチを書き込んでOK!のはずですが,私の環境では不具合が起こったため,同じ不具合が起こった人に向けて対処法なども記録します.

 

私の環境での不具合は,「読み取り・消去はできるが,書き込みの途中でハングアップして止まってしまう」というものでした.フォーラムには「28C256のプロテクトがかかっていた」というものがありましたが,どうもそうではなさそうでした.信号を調べたところ,スケッチのfast_write関数の中のwhile文がずっと回っているためにハングアップしてしまうことがわかりました.そこで,無限ループを防ぐためにwhile文の中に if(cyclecount==0xff) break; という感じで抜ける処理を書いたところ,正常に書き込まれるようになりました.本来であれば,ここの処理は書き込むデータとROMに書き込まれたデータが一致するか確かめるフェーズで,勝手に抜け出すと照合が取られない可能性があるので対症療法的な解決策ではありますが,まあ何も書き込まれなくなるよりはマシやろという感じで….

f:id:ibv:20210316183119p:plain

ハングアップが起きて,途中までしか書き込まれていない

 

f:id:ibv:20210316183642p:plain

きちんと書き込まれている.書き込み元との差分もなく,いい感じ

 

ということで,紆余曲折があったもののArduinoでEEPROMライタを作り,書き込みを行うことができました.引用元のフォーラムには他にも複数の誤作動が報告されているので,うまくいかない場合はそちらをご参照ください.

 

お読みいただきありがとうございました.よいEEPROMライフを!!

*1:Linuxソースコードからのビルドをやろうとしましたが,RXTX Libraryが現在サポートされてない古いライブラリで,少なくともJDK 11環境ではちょっと段階を踏まないとビルドできなさそうだったので諦めました.

RFIDってなに

この記事は eeic (東京大学工学部電気電子・電子情報工学科) Advent Calendar 2020 の20日目の記事です.

 

はじめに

eeic19の人です.電波的なことを研究しているのでそれに関したことをご紹介します.情報系ではないです.が,回路系を考えている人やそうでない人の心に響いたら嬉しいです.

 

RFIDってなにさ

さて,B3以上で「無線通信応用工学」を取った人はRFIDという言葉を聞いたことがあるかと思います.正式には「Radio Frequency IDentification」といって,「チップに記録されたID情報を無線を使って読みだすシステム」のことをいいます.従来の紙に印刷するバーコードと比べて,傷や汚れに強い,再利用できる,リーダを近づけなくていい,同時に取得できる… みたいな利点がよく掲げられます.

いい例としてユニクロの値札が挙げられます.ユニクロの商品についているタグにはRFIDシステムが組み込まれています*1ユニクロで買い物をしたことのある人はわかるかと思いますが,店舗によっては無人レジが置かれているところがあり,そこではこのRFIDを用いて商品情報・価格が自動的に読み取られています.

現在ユニクロで使われているRFIDチップはこのような外観になっています.

 

現状どんな感じなのよ?

我々一般人にもわかるRFIDの応用例として,さきほどユニクロのタグを挙げましたが,正直それ以外の産業ではあまり大衆には浸透していないというのが現状です.これ以外に知っている例は最近RFIDの導入を中止してしまったし…….

 浸透しない理由として,バーコードと比べて導入コストが高いというのが主な理由と言えるでしょう.紙とバーコードの白黒を判別できる程度のリーダがあれば成り立つバーコードに対して,より複雑な機構をもつリーダは高価格です.また,RFIDそのものも現状では製造コストが高価というのもあります.

 

技術的なアレコレ

そんなわけで価格を下げることが必要なRFIDですが,低価格化を達成するためにはさまざまなパラメータを考慮する必要があります.

使用周波数 

上で現在ユニクロで使われているRFIDの外観のリンクを貼りましたが,みなさんはどこにIDが記録されているかわかりますか?

・・・

正解は,画像の中心部にちょっと見える黒い点,この小さなチップにIDが記録されています.じゃあまわりの灰色のは何だというと,これは全て電波を送受信するアンテナです.見てわかるように,IDを記録する部分と比べて圧倒的にアンテナが大きいです.このアンテナをいかに改良させるかが問題となります.

RFIDチップの単価を安くする手段として「小型化して材料をへらす」という方法があります*2.しかしながら,アンテナを小型化するということは使用する電波の波長が短く,つまりより高周波を使う*3ことになります.高周波を使うということは,電波伝搬による減衰がより大きくなることを意味します*4.つまり使用できる距離が短くなり,「近づけなくてもいい」というメリットがなくなってしまうわけです.この「使用周波数 vs 通信可能距離」というトレードオフが改良に際しての論点となっています*5

 

アクティブ型・パッシブ型

 電波を受信したRFIDは,それに応じてIDを出力させる必要があります.そのID出力回路を動作させるために必要な電源を確保する手段が二種類あります.

 まず,IDチップに電池を一緒に組み込んでそれをもとに動作させる「アクティブ型」があります.この方法には,安定した電圧源とGNDを確保できるので回路を簡単にできるというメリットがあります.しかしながら,この方法では電池が切れたらいちいち入れ替える必要があるし,電池を含む分サイズも大きくなってしまうというデメリットがあります.したがって,RFIDには基本的に次の「パッシブ型」という方法が用いられます.

パッシブ型では,リーダが飛ばしてくる電波を整流して電源を作るため,電池を必要としません.しかしながら,電池で作れるほど安定した定電圧を作ることができないため,特殊な回路を用いる必要があります*6

 

反射波の受信

 また,RFIDチップが返してくるID情報が載った電波をリーダ側でどう受信するかも課題となっています.そのままの状態では,リーダがRFIDチップに飛ばした何も情報が無い電波とID情報が載った電波が混信してしまい,正確にIDを取り出すことは非常に困難です.これに関しては,MIMOライクに受信アンテナを複数使ったり,位相を変えたりすることが考えられています.

加えて,異なるタグから返される異なるIDを同時に受信するためには,読み取る際にIDの衝突が起きないように回路側に衝突回避機能を付ける必要もあります.

 

おわりに

RFIDという分野のさわりから始めて,現状や課題をご紹介しました.世間では5GだIoTだで,ハードウェアをやっていると何かと無線と関わることがあるかと思います[要出典].そんな時に「こんなのあったな~」程度にでも思い出していただければ幸いです.そしてB3は4Sのワイヤレスエレクトロニクスを,B2は3Aの無線通信応用工学を取ろう!!

 

参考文献

RFID/国内市場はまだ鈍く~2020年に5円は達成見込み|物流プラザ (2020-12-12)

 

*1:タグの裏をよく見ると金属っぽいものがくっついています

*2:小型化できれば,バーコードを貼ることが出来ない小さな部品を販売するお店(千石電商とか)も導入できるようになって一石二鳥です

*3:ちなみに,さきほどのユニクロのタグはUHF帯(900MHzくらい)を使っています

*4:フリスの伝達公式による

*5:別アプローチとして,受信電力が小さくなっても動作するような回路を設計するというのもあります

*6:このへんのことが最近の論文で議論されているようです