ページ

2022/01/15

Raspberry PiのSPI通信による7セグメントLED制御

 お次はこれ。

青色7セグメントLEDシリアルドライバモジュール 完成品
データシート

7セグLEDをシリアル通信(SPI通信)で点灯してみたい。

Raspberry Piで秋月の7セグLEDシリアルドライバを使用する

このページを参考にした。5V接続。

サンプルコードコピペしただけでいとも簡単に動いた。しかも表示がラッチされる(プログラムを終了しても点灯状態が維持される)。素晴らしい。そしてモジュールってすごい楽。しかし楽な反面、SPI通信の仕組みについてはあまり勉強にならなかった。

Raspberry Pi GPIOを使用したSPI通信(温度センサ)

SPI通信の標準モード接続はこれ。ここによると、ラズパイのピン数だと2スレーブまでしか制御できないことになる。しかし、デイジーチェーン接続を使うと、より多くのデバイスを接続できる。

SPIデバイスのデイジーチェーン接続

と思いきや、このデイジーチェーン接続は、ところてんの様に各スレーブ間でデータが押し出されていく形式。つまり、各スレーブを完全に独自に制御できるわけではないということ。各スレーブから順々にデータを取り出していくことや、順々にデータを渡していく方式に使えそう。それ以外の複数デバイス制御には、任意のアドレスを指定できるためSPI通信ではなくI2C通信のほうが適していそうだ。

ちなみにこれ、表示がラッチされるが、GPIO1ピン16mAの電流制限はよいのだろうか。データシート上は45mAとなっているが。。と、いうことは、ナマの7セグモジュールをつなげてはだめで、電流制限抵抗が必要だったかもしれない。あるいはGPIOとは別の5V電源を用意するか。ラズパイはUSBから電流を供給されているのだから、GPIOピンの制限によらない電流供給も可能なように見えるが。それが1番ピンのことなのだろうか?

Raspberry PiのGPIOピンの電気的仕様

ここによると、3.3Vと5Vのピンは大きな電流を供給可能なようだ。よかった。

Raspberry Piをリモートデスクトップ(VNC)で操作する

 VNCの導入。これまではPCとラズパイのディスプレイを共用していた。PCで参照サイトをみて、ディスプレイの入出力を切り替えてラズパイ上でコーディング。これは非常に効率が悪い。一方でラズパイ上でブラウザを開くと、とても重い。。

というわけでリモートデスクトップ機能を導入した。

VNCでRaspberry Piにリモートデスクトップ接続 (Windows/Mac/Linux対応)

何も詰まらずすんなり成功。これでPC上からラズパイの画面を見られるので、効率が格段に上がった。もっと早くやればよかった。

Raspberry PiでSDカード・NASへのファイル入出力のテスト

 次はラズパイでファイル入出力に挑戦。SDカード内へのファイル入出力。

これは多少試行錯誤があったが成功。途中で、Thonnyにスペースとタブの使い方が悪い的な怒られ方をしたが、結局原因わからず迂回。Pythonはインデントで文章構造を理解しているようだが、これが裏目に出てしまうことがあるようだ。スペースもタブも改行も確認したが。。

次はLAN上にあるネットワークHDDへのアクセス。

PythonでWindows共有フォルダへアクセスを参考にした。

pipコマンドとaptコマンドの違いがようわからないが、言われた通りpipを実行。pysmbをインストールして最小構成コードを実行したが、動かない。import文のsmb.smbconnetionのsmbというモジュールが存在しないと怒られる。どのサイトを見ても最小構成コードは同じで、悩ましい。

pipではなく、ラズビアンのほうにsambaをインストールしてみたが、結果は同じ。このエラーの解消には結構労力をかけた。

Pip listコマンドをみてみると、smbパッケージが表示されない。もう1回pysmbインストールを行ってみると、python2のフォルダっぽいパスが表示される。これまで見たサイトで、python3とpython2の互換性がなさそうな表現があったので、確認すると、ラズパイにはpython2と3が両方入っていた。

Python3とPython2共存環境で3にpipでパッケージインストールする方法

このサイトに従い、python3のほうにpysmbパッケージをインストールしてみると・・・最小構成でエラーは出なくなった!pythonのどのバージョンを使っているのか、意識することを学んだ。Pip listコマンドでは相変わらずsmbが表示されないが。。

で、次。
「Unable to connect to shared device」の表示。ここからはsambaプロトコルとの闘いか?→大きな苦労をせずにネットワークHDDにテキストファイルを保存できた!これで、途中で電源が切れてもファイルは残せる。(OSはクラッシュするかもしれないが。。)

Raspberry Piによる温湿度センサ(DHT11)のテスト

次は何かセンサを試してみたいということで、温湿度センサを接続した。

今回買ったのはDHT11温湿度センサモジュールで、センサ単体ではない。モジュール化された温湿度センサとのこと。しかし、秋月電子のページにはセンサ単体のデータシートしかない。センサ単体は4本のピンが出ているが、モジュールからは3本のピンしか出ていない。

http://akizukidenshi.com/download/ds/aosong/DHT11_20180119.pdf

このサイトRaspberry PiとDHT11で温度・湿度を測るを参考に、適当に接続してみる。自分が買ったモジュールとこのサイトのモジュールは同じ製品ではないが、ピンの数は同じなので同じやり方で行けそう。抵抗はモジュールにすでに入っているようなので、ブレッドボード上は配線せず。

7セグチカと違ってセンサはデジタル通信をしているので、上記サイトによると別途ライブラリのインストールやらが必要なようだ。

apt-get コマンドを実行したところ、既に最新版が入っていると出た。サンプルスクリプトを実行したら、驚くほど簡単に終了。gitをはじめとしたこの開発のエコシステムはすごいと実感。

この後、得られた温湿度データを7セグLEDに表示させたかったが、前段で作った7セグチカプログラムはLED表示を1数字ごとに関数化していたので、そのままでは処理が面倒くさいので(その割に得られるものは少ない)、一工夫が必要。

7セグチカプログラムをモジュール化した。文字列処理、モジュール化後のインポートなどに手間取りつつも、温度を7セグに表示させることに成功!

Raspberry Piによる7セグメントLED点滅②

ブレッドボード上にいざ配線(実装)。

実装後、思ったこと。
  • 配線図通りに実装できない
  • 買った抵抗が大きすぎた(配線図上で抵抗の大きさを考慮できていなかった)
  • 抵抗が小さかったとしても、抵抗の近傍の配線は難しく、実装スペースを考慮できていなかった
  • 配線図で使っていたブレッドボードより、購入したブレッドボードのサイズが小さかった
  • コードが柔らかい撚線タイプでよかった。硬線タイプだったら破綻してたかも
というわけで初めのうちは余裕のある配線図が必要。四苦八苦しながら、なんとか配線した。そしてラズパイの電源ON。緊張の電源投入。

立ち上げ直後から7セグには「3.」の表示。まだ何もプログラムしていないのになぜ・・・?まあ配線間違いとかで燃えなくてよかった。7セグLEDの4pinと2pinが光っていないようだが。配線はされている。
まずドットの部分の表示、GPIO12をプログラムで制御してみよう。

参考サイトはこれ
ところが思ったようにうまくいかず・・
以下のような点がうまくいっていない
  • ラズパイをシャットダウンしてもセグメントA,B,C,D,G,DPは淡く光る
  • GPIO16を制御しても何もつかない
  • GPIO26を制御するとBが光り、Cが弱く光る
  • 上に書いたように、ラズパイ起動時にぼやっと光っていた
  • それ以外は正常(に見える)
あと、全部光らせた状態で何A流れてるかも測りたい。

テスターでの電圧測定なども交えて色々調査したところ、抵抗の足どうしが接触(ショート)していたことが判明。これで一部が解消した。
さらなる調査。
各箇所にテスターを当てていくと、GPIO端子をlowにしていてもGPIO端子に0.8Vほど電圧がかかっている。プログラムのほうもいじってみた結果、GPIOを1回exportすると暗いLED表示は解消されることが分かった。前回のGPIO設定が残っているのか、あるいはGPIO OUTではなくGPIO INがデフォルトだったのかもしれない。(1部のGPIOだけそうなのは不思議だが)

その後、Pythonのプログラム上からも無事7セグチカに成功。プログラムの参考は下記。
プログラムを使って分かったのは、GPIOをcleanupしてもやはり前回の設定が残っていそうだということ。このあたりはもう少し実験してみたいが、ほかの興味が先行するので後回し。

7セグチカが成功したので、次は温湿度モジュールか、7セグのI2C通信による表示かな。


2022/01/13

Raspberry Piによる7セグメントLED点滅①

 ラズパイを買ってまずすることといえば、Lチカである。多くのサイトにそう書いてある。Lチカとは、ラズパイ上で書いたプログラムからLEDをチカチカさせること。確かに、普通のパソコンを買ったときにはできないし、ディスプレイへの表示以外のデバイスへの反応を見ることができるとワクワクするのだろう。

しかし、ただ1つのLEDを光らせるだけでは物足りないので、7セグメントLED(7セグ)を衝動買い。しかも複数桁表示のもの。

小型3桁緑色7セグメントLED表示器 7mm高 アノードコモン 2381BG

あまり調べずに買ってしまった。これが良くなかった。1桁の数字は7セグメントでできていて、それが3桁。+3ドットで計24個光らせたい部位があるが、ピンは12本。足りなくないか?中で回路が入っていて高度に制御されているのだろうか?また、ラズパイのGPIOには流せる電流の制限値があり、たくさん光らせるとこの制限に引っ掛かかるのではないか?

というわけできちんと調べた。
データシートの回路図によると、どの桁に表示をするか選択をしたうえで、ある1桁の数字を表示するということらしい。複数桁を同時に光らせる場合は、すべて同じ数字にしかならない。それ何の意味があるのか・・?と思ったが、とりあえず、時間差をつけて各桁を光らせれば、3桁の表示として使えそうだ。。そうすると最大電流の問題もクリアされる。

ちなみに、後から分かったことだが、この手の7セグLEDは超高速で各桁を1桁ずつ表示することで、結果全桁が表示されているように見えるらしい。
Raspberry Pi Picoで4桁7セグLEDをダイナミック表示のやり方が参考になる。どのみちこうなると抵抗以外にトランジスタも必要。そのうち試してみる予定。

抵抗の選定はRaspberry Piで7セグメントLEDを簡単に点灯させよう (1) LEDの点灯方法を参考にした。

(3.3V-1.93V)/330Ω = 0.0042 A

1.93V(順電圧)は、20mA流した時の値なので、実際にはこの計算式は正確でない気がするが、とりあえず必要な抵抗はざっくり330Ω。7セグすべて光らせるときは電流オーバーになっていないか注意。

秋葉原のマルツで不足パーツを買ってきた。

  • 330Ω 金属被膜抵抗 2W
  • 10kΩ 酸化金属皮膜抵抗 2W

安価でスタンダードなカーボン抵抗は1/2W以下しかなかった。それでも行けそうだが、きちんと計算していなかったので安全側を購入。ばかでかい抵抗。

また結局複数桁表示をやめて、1桁7セグも新たに買った。秋月電子のサイトと異なり、データシートは自分で探す必要がある。検索するとこれ


このシートにはどのピン番号とどのセグメントが対応するかが書いてある。しかし、実物にはピン番号が印刷されていない。裏面から推測すると、3と6と8はわかるが、あとは勘か。業界の常識があるのだろうか?

ラズパイ3A+のピン配列は、公式サイトより

このようになっている。この中から、特殊な機能が割り当てられていなさそうなピンを使ってみる。実物を見ても、それが1番ピンかわからないが、裏の半田付けが□になっているのが1番だろう。Flitzingで作ったブレッドボード配線図がこんなかんじ。

次回、いざ配線。



2022/01/12

Raspberry Piの購入までから立ち上げまで

前から気になっていたRaspberry Pi(ラズパイ)を購入することにした。

まず、どのモデルを購入するかを検討した。
私が購入した時点で、以下の選択肢があった。
  • Raspberry Pi 3 Model A+
  • Raspberry Pi 3 Model A
  • Raspberry Pi 3 Model B+
  • Raspberry Pi 3 Model B
  • Raspberry Pi 4 model B
  • Raspberry Pi Zero
  • Raspberry Pi Zero W
  • Raspberry Pi Zero WH
最も性能が高いものだとRaspberry Pi 3 Model B+ということになるが、
  • 価格
  • 性能
  • 消費電力
  • インタフェース
といったポイントのバランスを考え、Raspberry Pi 3 Model A+を選択。
どれを選択するかに影響するので、それで何をしたいかを漠然とでもいいので考えておく必要がある。自分の場合は、
  • Linuxの勉強
  • 住環境の改善につなげるための、
    • 温湿度ロガーの作成
    • 分電盤電流センサの作成
あたりが目的であった。

買って早速以下のように接続。ACアダプタは、購入したラズパイの消費電力と電圧に見合うものを買う必要がある。ここが意外と選択肢が狭い。


  1. ラズパイの電源を立ち上げる(=ACアダプタをコンセントにさす)前に、ラズパイのOSイメージの準備。ラズパイの本家サイトhttps://www.raspberrypi.org/software/よりラズベリーパイOSマネージャのダウンロード。
  2. 次に、ラズパイのOSイメージを書き込むmicroSDカードをFAT32でフォーマット。
  3. OSマネージャを実行
  4. OS選択、書き込み先(microSDカード)を選択して実行
  5. ラズパイの電源投入。
  6. ちなみに何回立ち上げても、初回立ち上げ画面が出る。なぜだろう?→2回目からでなくなった
  7. あとはウィザードに従うのみ。これでLinux(Raspbian)がインストールできた。お手軽にLinuxの環境が出来上がって感動。
  8. OSは日本語の表示にできるが、日本語入力はできなかった。
  9. Raspberry Pi3の日本語入力を有効にするを参考にIMEをインストールする。しかし、日本語入力は思ったように動いてくれない。ここは後で研究せねば。。
ちなみに、ラズパイの立ち上げはコンセントを指すだけだが、シャットダウンはコンセントをいきなり外すと、クラッシュする恐れがある。ラズパイがSDカードに書き込んでいる最中にぶち抜きをやると起こりやすいらしい。OSのメニューからシャットダウンを選んで、OSが落ちたのを確認してからコンセントを抜く。(LED等で知らせてくれるわけではないので、OSが落ちたことの確認が厳密にはできないのだが。)

裸のラズパイをずっと放置しておくのは精神衛生上悪いので、何かしらケースが欲しいところ。






ラズパイとラズピコで分電盤センサを作成(14)

回路の実装図作成に取り掛かろうと思ったが、ここで一つ寄り道。 ADCへの入力前に交流電圧に対して直流バイアスをかける手段として、オペアンプを使う方法が出てきた。 アナデジ太郎の回路設計 というか、バイアスをかけたい場合、この方法の方がメジャー・・? と思ったのだが、オペアンプは以...