質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

3回答

2738閲覧

raspberry pi picoのPIOを使って100個のledを1ms毎に光らせたい

rx0

総合スコア4

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/09/08 02:26

raspberryPi Picoで1ms毎に1個のLEDを光らせて、合計100個のLEDによる1msを判別できるタイムカウンターを作りたいと思っています。

精度を高めるためPIOを使いたいのですが、PIOの命令数に限りがあるため、上手く行う方法がわかりません。

MicroPython環境で行おうとしています。CCでも構いません。

不可能の可能性もあると思いますが、アイデアのある方がいたら教えていただけないでしょうか?

※精度が欲しいのでPIOかと思っていますが、他の方法でも構いません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

thkana

2021/09/08 12:38

PIOはまだいじったことがないので感じがわかりませんが...それ以前の話として、 RaspberryPi picoには100本も足がありませんから、100個のLEDをマイコンのみで制御しようとすればマトリックスを組んでダイナミック制御をすることになります(マイコンのみといっても、マトリクスの構成によってはLEDの電流を受けきれませんから、トランジスタなどでドライブしなければならないかもしれません)。 この場合、"高精度の1ms"というのはどういう意味合いで考えておられるのでしょうか。具体的にLEDがどのように点灯すればよいのか、例を示していただけますでしょうか。また、単に「高精度」というだけでなく、1msに対してどのくらいの誤差?偏差?が許されるのか、なんていう情報も結構重要と思います。
rx0

2021/09/08 13:31

ご指摘ありがとうございます。 実現したいことは、100個のledを横一列に並べて、そこから1ms毎に左から右に順次点灯させ、1番右についたらまた1番左に戻って順次点灯…というものです。 これをビデオカメラなどで写し込んで、1フレームごとのledの点灯位置の遷移を見ることで、各ビデオカメラのフレームレートを1ms単位で分析できるストップウォッチのようなものを作成することを目的としています。 数μs程度の精度でledを点灯させたいと思っています。
guest

回答3

0

今どきで普通の「ビデオカメラ」と称するものならフレームは1/60=16.66msなので

各ビデオカメラのフレームレートを1ms単位で分析

はどうでしょう。特殊用途でも数千フレーム/secの超高速カメラ(昔仕事で使った。数百万円とかする)でもなければ(あるいはそれでも)、数μsの精度に意味が出ないのではないでしょうか?

それはともかく。
ちょっと考えてみましたが、PIOのみではちょっときびしそうです。命令数もですが、レジスタにあるデータを単純に1bitシフトするなんてことができなかったり、クロックも分周して2KHz程度までなので100msを測るような「ものさし」にはしにくい感じ。(こういうのが得意なウイザード級の人がちょいちょいやるとできちゃったりするのかも知れませんが...)
1ms毎にPython側で生成するFIFOのデータを拾って出力するものを2系統、マトリクスのHとVでそれぞれ、みたいな構成ならできそうかな、なんて思いますがそれくらいだったら単純に1msをタイマー割り込みで作ってLEDを制御しても、ちょっと注意してやれば(分岐の仕方によっても処理時間ができるだけ変わらないように等)そこそこの性能にできそうに思います。

投稿2021/09/10 15:23

thkana

総合スコア7659

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

MicroPythonについては詳しくありませんが、必ずしもPIOを使う必要は無いでしょう。
質問文では曖昧でしたがコメントを見るに100個のうち1個のみを順に点灯させていくという意味ですね。
適宜マトリクスを組み、100パターンの出力を事前に計算しておいて、
1msのタイマー割り込みを用意して、割り込み内で「今回のパターンを出力→次のパターンを用意」とすればクロック単位で正確な出力ができると思います。
ピンは十分多いので10×10の単純なマトリクスにするのが楽でしょう。CharlieplexingなどするとHigh-Zの処理も必要でタイミングの考慮事項が複雑になります。

タイマーを他に使ってしまっているとか、割り込みを他にも使っているという場合であれば、PIOを使うことも考えられます。
PIOに関してはデータシートを読んだ程度の知識しかありませんが、この場合、PIOで行う動作は「1msカウントダウンして、FIFOからPULL、それをピンに出力」として、FIFOへ上記100個のパターンを割り込みなり地のコードなりで出力するのがよいと思います。

投稿2021/09/08 16:38

ikadzuchi

総合スコア3047

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

100個のLEDを精度1msですか。
実はこれを実装している製品というのが案外身近にあります
いわゆるアミューズメント機器、ってことで、要するにアーケードゲーム、とかパチンコ台、とかそこらへんの機器ですね。
そいつらは、カラーLED(RGBの3色)を数十個、それこそ1msや0.5ms単位で、PWMを掛けて、色相調整やら明度調整を行って、いろんな表現を行っています。
今度見かけることがあれば、よく見てみましょう

さて、その実現方法ですが、TLC5927 というLEDドライバICを調べてみましょう
#他のメーカ、他の型番でも同様なドライバICがたくさん出てます
こいつは、16出力を持つLEDドライバICで、データはSPI駆動でLE(ラッチイネーブル)入力を持ちます
100個であれば、このドライバを7つカスケードにつなげれば、1ポートのSPI(SCLとMOSI出力)と一つのLE出力の、3つの出力ポートだけで、全LEDを同期出力することが可能となります

まあ、1ms周期でどーこ~するなら、1msのタイマ割り込みを実装し、割り込みハンドラ内でLEパルス出力、SPI出力開始を行えばいいという話となります

投稿2021/09/08 12:16

編集2021/09/08 12:34
y_waiwai

総合スコア87800

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問