Dフリップフロップ

概要

Dラッチは、入力Gが1になっている間入力D(データ)の値を出力Qに出し続ける。一方入力Gにクロックパルスが与えられる場合、入力データの値をクロックパルスの立ち上がりで一度だけ記憶・出力して、次のクロックの立ち上がりまでその出力を保持したいときには、Dラッチではうまくいかない。

Dフリップフロップはこのような場合に使う。Dフリップフロップ回路は、以下の様にDラッチを2つ連ねた形をしている。

この回路は、CLKの入力が0→1に立ち上がった時のDの値を保持し、次に再びCLKが0→1に立ち上がるまでその値を保持し続ける。

基本的なDフリップフロップは以下のようなシンボルで表される。

仕組み

前段・後段それぞれのラッチのGに与える信号を反転させているのがミソで、以下のような流れになる。

  • クロックレベルが0のときは前段のラッチが入力状態、後段のラッチが保持状態となる
    • 前段のラッチは入力の値を出力し続ける
    • 後段のラッチは前段の値に関わらず保持内容を出力し続ける
  • クロックレベルが1になると、前段のラッチが保持状態、後段のラッチが出力状態になる
    • 前段のラッチはそれまでの入力内容を保持する
    • 後段のラッチは前段の保持内容を出力し始める
  • 再びクロックレベルが0になっても、後段のラッチは前のステップで入力された値を保持し続ける

イメージで図にすると以下の様になるだろうか。

回路図での確認

Dフリップフロップの動作を回路図で確認すると以下の流れになる。

初期状態として、すべての端子の信号レベルが0の状態とする。このとき前段のG1への入力のみ反転して1となり、前段のラッチは出力状態、後段のラッチは保持状態となっている。

その状態で入力が1となった場合。前段が出力状態となり1を出力するが、後段は保持状態のため、最後の出力は変化しない。

ここでクロックが1となると、前段が保持状態、後段が出力状態となり、最後の出力が1に変わる。クロックが1の間に入力値が変化しても、立ち上がり時の値が前段で保持されているので、出力は変わらない。

その後クロックが0となると、後段が保持状態となり、最後の出力が維持される。

その後入力信号が0となっても、後段で保持されている値が出力され続ける。

タイミングチャート

Dフリップフロップの動作をタイミングチャートで見てみた。下図の緑/オレンジの色がついている部分が前段/後段がSetの状態、色がついていない部分がそれぞれのHoldの状態。

各ステップでの状態は以下の様に推移する。

Step CLK 入力 前段の状態 前段の出力 後段の状態 後段の出力
a 0 0 Set 0 Hold 0
b 0 1 Set 1 Hold 0
c 1 1 Hold 1 Set 1
d 0 1 Set 1 Hold 1
e 0 0 Set 0 Hold 1
f 1 0 Hold 0 Set 0
g 1 1 Hold 0 Set 0
h 0 1 Set 1 Hold 0

 

Dラッチ

 

Dラッチ(D-Rarch)回路は以下のような回路。

この回路の動作は以下の様になる。

  • G=0の間、(Q, Q̄)は保持される
  • G=1の間、Q = D、(Q, Q̄) = D̄

このラッチはゲートGのレベルが0の間は値を保持し続け、Gが1になると入力Dの値をそのままQに出力する。このことを左の回路で確認する。

回路後段はRSフリップフロップとよく似ていて、入力にNOTゲートを入れればRSフリップフロップになる。ちょうど回路前段がNANDゲートになっているので、これをANDゲートとNOTゲートに分ければ、以下の様に表現できる。

次に回路前段の動作について考える。入力の0と1の組み合わせに対して、出力は以下の様になる。

この結果とRSフリップフロップの動作を合わせると、以下のような真理値表になる。

  • Gが0の間、QとQ̄を保持
  • Gが1の間、QにはDが出力され、Q̄にはD̄が出力される

たとえば以下のようなタイミングチャートになるか。

 

 

RSフリップフロップ

RSフリップフロップの動作

今まで横目でやり過ごしていたフリップフロップ回路について整理してみた。以下のようなRSフリップフロップを考える。

 

S R Ǫ Ǭ
0 0 保持 保持
0 1 0 1
1 0 1 0
1 1 禁止

一般には(S, R)の入力が(1, 0)や(0, 1)のように与えられたとき、以下のように説明されているものが多い。

  1. たとえばS = 1のとき、Ǭ側のNORゲートの出力は0 で確定
  2. その結果r = 0となり、R = 0の入力と合わせて、Ǫ側のNORゲートの出力は1となる

ただ、以下のような点が気になった。

  • そもそも入力が1の方が必ず先に動くのか
  • 電源投入時などにǪやǬの値が不定になったときにどうなるのか

何せ素人なので半導体素子の中でどういうタイミングで何が起こっているのかよくわからないが、自分なりに追ってみることにした。

あまりうまくない例

まず、(S, R)が(禁止されている(1, 1)の組み合わせの場合も含めて)与えられたとき、(Ǫ, Ǭ)の値が予めいろいろなパターンをとっていたとして、その後の推移を確かめてみた。

以下の表は、そのような時の状態変化を追ってみたもの。(Ǫ, Ǭ)の出力が確定しているので、与えられた(S, R)との組み合わせで(r, s)にフィードバックされる値が変化していくと考えた。

この表からは、以下の様なことが読み取れる。

  • (R, S)が(0, 1)や(1, 0)のときは、2サイクル目以降想定される出力で安定
  • (R, S)が(0, 0)のときは
    • (Ǫ, Ǭ)が(0, 1)や(1, 0)のときは1サイクル目から元の値が保持される
    • (Ǫ, Ǭ)が(0, 0)や(1, 1)のときには振動する
  • (R, S)が(1, 1)のときには(Ǫ, Ǭ)が(0, 0)になる

ここでも以下のようなことが気になる。

  • (Ǫ, Ǭ)が(0, 1)や(1, 0)のときに(R, S)に同じパターンを入れると、1サイクルだけ(R, S) = (0, 0)の状態になるが、これはナノ秒のレベルで実際に起こることなのか
  • (Ǫ, Ǭ)が(0, 0)のときに(S, R)に(0, 0)や(1, 1)を入力すると、その後(Ǫ, Ǭ)がごく短周期で振動するが、実際にそうなのか

そこで、回路のゲート単位で実行順序が変わった場合にどういう結果になるか確認してみた。

回路レベルで追った例

入力と出力が同じパターンの場合

一つ目は、(S, R)に(Ǫ, Ǭ)と同じパターンを入力した場合。以下の例では(Ǫ, Ǭ) = (0, 1)のときに(S, R) = (0, 1)を入力したケース。

まず上の方のゲートが先に動作した場合、以下の様に変化する。

  1. 入力Rが変化したとき、上のゲートが動作するが下のゲートの入力sへの帰還入力は変化しない
  2. ここで入力Sが変化していたとして下のゲートが動作しても、出力は変わらない
  3. 以後、安定状態に達する

また下のゲートが先に動いた場合も同じ流れで、結果は同じになる。

パターンが逆の場合も、回路は対称なので同じ流れになる。

入力と出力のパターンが逆の場合

二つ目は、(S, R)に(Ǫ, Ǭ)と逆のパターンを入力した場合。以下の例では(Ǫ, Ǭ) = (0, 1)のときに(S, R) = (1, 0)を入力したケース。これは少しややこしい、

  1. 入力Rが変化したとき上のゲートが動作するが、その出力と下のゲートの入力sは変化しない
  2. 入力Sが変化したとき下のゲートが動作し、その出力と上のゲートへの帰還入力は1→0に変化する
  3. それにつれて上のゲートが動作し、出力と帰還入力sは1に変化する
  4. それにつれて下のゲートが動作するが、その出力と上のゲートへの帰還入力0は変化しない
  5. 以後、安定状態に達する

一方、下のゲートが先に動作した場合は、すぐそのあとに下のゲートが動作して安定する。

出力保持の場合

入力(S, R)が(0, 0)の場合は出力は保持されるが、これを確認する。

以下の例では上のゲート、下のゲートの何れが動作するときも状態は変化せず、出力は変わらずに安定する。出力が逆のパターンでも、対称性から同じように保持される。

禁止状態の場合

最後に、禁止されている(S, R) = (1, 1)を入力した場合を確認する。以下の例では元の出力が(0, 1)の場合を例にしているが、入力の何れも1なので、有限のサイクルで必ず(Ǫ, Ǭ) = (0, 0)となる。

問題はその後に(S, R) = (0, 0)の保持信号を入力したときで、同じ状態から始めても最初に動作するゲートによって結果が異なってしまう。

まず、以下は上のゲートが最初に動作した場合。結果は(Ǫ, Ǭ) = (1, 0)となる。

一方下のゲートが最初に動作した場合は、結果が逆の(Ǫ, Ǭ) = (0, 1)になる。

したがって、(S, R) = (1, 1)が禁止されている背景を整理すると以下の様になる。

  • (S, R) = (1, 1)を入力すると、結果は必ず(Ǫ, Ǭ) = (0, 0)になる。
  • このパターンは(Ǫ, Ǭ)が符号通りの否定関係にならない
  • その後、そのパターンに対して(S, R) = (0, 0)の保護信号を入力した場合、結果が一つに特定できない

以上のことから、ゲートの動作順序レベル(入力信号の到達時刻レベル)の違いに対して、RSフリップフロップの論理値表の意義が一定理解できた。

RSフリップフロップの回路構成

RSフリップフロップは、NORゲートで表現される場合とNANDゲートで表現される場合がある。それらについての覚え書き。

冒頭のNORゲートによるRSフリップフロップ回路は以下の通り。

NORゲートは入力が否定ゲートのANDゲートと等価なので、以下の様になる。

ANDゲートをNANDゲートに変え、出力を変えない様にすると以下の様になる。

最終段のNOTゲートを除き、Ǫと Ǭを反転させて以下を得る。入力と出力の配置がNORゲートと逆になるが、S (Set)とがǬが同じ側に来るので直感的にわかりやすい。

 

RSフリップフロップは、以下のような記号で表される。

 

LEDの保護抵抗

対象とする回路

以下のような回路を考える。

ここで各記号の意味は以下の通り。

  • E:電源電圧
  • Vf:LEDにかかる順電圧
  • If:LEDを流れる順電圧
  • Vr:保護抵抗による電圧降下
  • R:保護抵抗値
  • I:回路を流れる電流(I = If

Vf(順電圧)やIf(順電流)は、それらを用いる人や場合によってLEDが発光し始める閾値や典型値など定義が異なっているが、ここではその時点の回路での値とする。

保護抵抗による電圧降下

保護抵抗による電圧降下、抵抗値、回路電流の間では、以下のようにオームの法則が成立する。VrIの線形関数となっている。

(1)    \begin{equation*} V_r = R I \end{equation*}

LEDの特性

一方LEDの順電圧Vfも電流の関数だが、それは一般的な固定抵抗のものと異なり、電圧によって非線形的に電流が変化する。以下は赤色LEDの特性曲線を概ねのイメージで描いた例。

LEDの電流~電圧特性の特徴は以下の通り。

  • LEDにかかる順電圧がある閾値を越えるまでは電流は流れず発光しない
  • 順電圧が閾値を越えると、電圧値に対して急に電流が増加する
  • 順電圧の僅かな変動に対して、順電流の変動が大きい

LEDの内部抵抗で考えると以下のように表現できる。

  • 閾値以下ではLEDの内部抵抗は∞と考えてもよいくらい大きい
  • 閾値を越えると、順電圧の増加に対して内部抵抗が急激に減少していく

回路に関する計算

基礎式

LEDの順電流・順電圧に関する特性曲線をI = If(Vf)という関数で表し、電源とLEDの内部抵抗をゼロとして考えると、回路全体の電圧のバランスは以下のようになる。

(2)    \begin{equation*} E = V_f + RI = V_f + R I_f(V_f) \end{equation*}

これをIfについて解くと以下のようになる。

(3)    \begin{equation*} R = \dfrac{E - V_f}{I_f(V_f)} \end{equation*}

IfVfの関数になっているのでややこしいが、一般にはデータシートの典型値などをそのまま用いて計算する例が多い。たとえば電源電圧が3.3Vで赤色LEDを発光させる場合、典型値としてIfTYP=20mAの時にVfTYP=2Vという値が示されているとすると保護抵抗値は以下のようになる。

(4)    \begin{equation*} R = \dfrac{3.3 - 2}{0.02} = 65 \Omega \end{equation*}

よく見かける保護抵抗値は100Ωとか330Ωといった値だが、こういう場合のVfIfがどのようになるか、また順電流を10mAや30mAにしたい場合抵抗値をどうするかといったことを知りたい場合は非線形な方程式を解かなければならない。

特性曲線にの読み取りによる計算

LEDの特性が先に示したような特性曲線のように与えられている場合、電源電圧3.3Vに対して順電流をIf = 10mAとしたい場合は、グラフからVf =2.4V程度となるので、保護抵抗値は以下のように求められる。

(5)    \begin{equation*} R = \dfrac{3.3 - 2.4}{0.01} = 90 \Omega \end{equation*}

順電流の絶対最大定格値が30mAの場合、これを越えないようにするための最低の保護抵抗値はどうなるか。先の特性曲線からIf = 30mAに対してVf = 2.6V程度と読み取れるので、以下のように計算される。

(6)    \begin{equation*} R = \dfrac{3.3 - 2.6}{0.03} \fallingdotseq 23.33 \Omega \end{equation*}

市販のLEDのデータ

市販のLEDのデータシートの値の例は以下のようになっていた。なおA社のデータシートによると、より長期間使用するために順電流値を10~30mAの間で使用することが推奨されている。

これらのLEDを典型値で用いる場合の保護抵抗値を計算してみる。A社の赤、青・緑のLEDを5Vで使う場合、

(7)    \begin{equation*} \left\{ \begin{align} \dfrac{5 - 2.1}{0.02} &= 145 \Omega \\ \dfrac{5 - 3.4}{0.02} &= 80 \Omega \end{align} \end{equation*}

またB社の赤、緑のLEDを3.3Vで使う場合、

(8)    \begin{equation*} \left\{ \begin{align} \dfrac{3.3 - 1.9}{0.01} &= 140 \Omega \\ \dfrac{3.3 - 2}{0.01} &=  130 \Omega \end{align} \end{equation*}

なお各LEDのIfVfの関係をデータシートの特性曲線から典型値で読み取ってみると以下のようになり、概ね表の値に一致する。

  • A社の赤LED→20mAに対して約2.13V
  • A社の緑・青LED→20mAに対して約3.4V
  • B社の赤LED→10mAに対して1.9V

不明LEDの特性曲線

Raspberry Pi用のキットにはパーツのデータシートや型番などがなく、LEDの特性も分からない。そこで、抵抗値を取り換えながらVfVrを計測し、Ifの計算値をプロットしてみた。
データシートで見られるカーブの形をしており、赤・緑・黄色の特性が近く、青と白はより大きなVfを必要としている。

特性曲線は指数関数で近似できるので、片対数軸で表示してみる。若干指数関数よりもVfに対するIfの増加率が緩やかな傾向がある。

Excelの分析ツールでも指数関数近似をしてくれるが、ここで以下の式形で回帰をしてみた。まず以下の式で回帰する。

(9)    \begin{equation*} I_f = a e^{b V_f} \end{equation*}

一般にはa(exp(b Vf) – 1)の形で示されているが、回帰計算のしやすさのために形を少し変えている。両辺の対数をとって線形回帰する。

(10)    \begin{equation*} \ln I_f  =  \ln a + b V_f \end{equation*}

結果は分析ツールのグラフと同じ形で以下のようになる。

片対数で表すと以下のようになる。

対数軸で線形性が良好な緑と黄は元の関数形でもよく一致しているが、赤と青・白についてはVfが大きいところでの乖離が大きくなる。ただしVfに対してIfが小さく推定されるため、たまたまとはいえ安全側になっている。

各色のLEDに対する推定式の定数は以下のようになった。

対数化した線形式での相関係数は0.978~0.999程度であり、かなり高い。土質・地質工学や水理学のように自然現象を扱う場合とは異なる。

なお、Ifを希望する値にするための抵抗値は以下のように計算できる。

(11)    \begin{equation*} I_f = a \exp{b V_f} = a \exp{b (E - R I_f)} \end{equation*}

この式をRについて解いて、

(12)    \begin{equation*} R = \dfrac{E - \dfrac{1}{b} \ln \dfrac{I_f}{a}}{I_f} \end{equation*}

Ifを変化させた場合、各色のLEDに使う保護抵抗値は以下のように計算される。

キットのテキストでは220Ωの抵抗をよく用いているが、その場合は赤・緑・黄色が7~8mA程度、青と白では4mA程度ということになる。実際、青と白のLEDは少し暗めかなというくらいの明るさなので、これらの計算結果は腹落ちできる。

 

7セグメントLED

配置図

7セグメントLEDのピン配置は以下の通り(コモンカソードの場合)。

セグメントコード

各セグメントを0で消灯、1で点灯するとして、a~g及びDPを逆順にして0~Fを表示させるビット配列は以下のようになる。

表示 dp g f e d c b a Hex
0 00111111 0x3f
1 00000110 0x06
2 01011011 0x5b
3 01001111 0x4f
4 01100110 0x66
5 01101101 0x6d
6 01111101 0x7d
7 00000111 0x07
8 01111111 0x7f
9 01101111 0x6f
A 01110111 0x77
B 01111100 0x7c
C 00111001 0x39
D 01011110 0x5e
E 01111001 0x79
F 01110001 0x71

GPIOに直接接続

7セグメントLEDの動作を確認するため、以下の様にRaspberry Pi 4BのGPIOに接続した。

点灯テストは以下のコードで行った。

  • LEDの各ピンにGPIOのピンを割り当て
  • 0~9, A~Fの表示に対応するビットパターンを定義
    • ビット配列はdp, g, f, e, d, c, b, aの逆順
  • 16個のパターンを0.5秒ずつ表示
  • パターン表示はビット配列を必要分だけシフトして、ピンに対応するビットが1の場合にセグメントを点灯、0の場合に消灯
  • 終了時に全セグメントを消灯

このような接続の場合、LEDの8つのピンに対応してGPIOのピンも8つ消費される。

より少ないピンの数で7セグメントLEDを接続するためには、シフトレジスターを用いるのが一般的。

 

Raspberry Pi – LEDバーグラフ

概要

LEDバーグラフの実験例。DavinciキットのLEDはピン配置がわからなかったので、まず3.3VとGNDで確認した。

回路図

以下の通り、アレイになっている10個のLEDを3.3Vに抵抗を介して繋ぎ、各ポートに接続。ポートのレベルをHIGHにするとLED消灯、LOWにするとLED点灯になる。

コード

今回はピン番号を物理番号(GPIO.BOARD)で定義している。接続数は多いが独立したLEDを扱うのと同じで、以下の例では短い間隔でLEDを順次点灯・消灯させて、流れるように表示させている。

 

Raspberry Pi – RGB LED


概要

DavinciキットのRGB LEDを試してみる。オリジナルのコードを少し変えて、3色をまとめて扱うするクラスを作ってみた。また、徐々に明るさを変化させてみた。

回路

RGB LEDのピン配置は以下のようになっており、最も長いピンがGNDでRed-GND-Green-Blueの順に配置されている。

回路図は以下の通り。

コマンドラインで以下を実行して、接続を確認。

基本コード

辞書でR/G/Bのピン番号を設定し、周波数を100HzにしてLEDの発色を確認。

クラス化と色変化

3色のLEDをまとめて扱うクラスを定義。

  • コンストラクターでピン番号と周波数を指定してインスタンスを生成
  • startメソッドでPWMの作動開始
  • changeDutyCycleメソッドでデューティー比を変更設定
  • stopメソッドでPWM停止とGPIOのリソース解放

定数COLORSで定義した色を順次発色させている。カラーコードからデューティー比への変換は1つの関数で一括して行っている。

色と輝度の変化

R/G/Bを順に徐々に明滅させる例。カラーコードや変換関数は使わず、直接各色のデューティー比を0~100~0に変化させている。

 

Raspberry Pi – LED点滅

概要

SunFounderのDa Vinciキットを買ったので、まずLED点滅から勉強。実行の主要部分を強調するため一部簡略化した。流れは以下の通り。

  • LEDと保護抵抗を直列に繋ぎ、アノード側を電源ライン、カソード側をGPIO17に接続
    • GPIO17がHIGH (3.3V)のときは電源電圧とバランスしてLEDが消灯
    • GPIO17がLOW (0V)の時は電流が流れてLEDが点灯
  • MicoroPythonで、GPIO17のHIGH/LOWをタイマーでウェイトさせながら切替え

要点

  • GPIOを制御するライブラリーRPi.GPIOGPIOの名前でインポート
  • GPIO.setmode(GPIO.BCM)でBCMナンバリングモードに設定
  • GPIO.setup(ピン番号, GPIO.OUT, initial=GPIO.HIGH)でGPIO17を出力に設定し、初期レベルをHIGH (LED消灯)に設定
  • GPIO.output(ピン番号, GPIO.HIGH/LOW)で電圧レベルを切替え
  • キーボード割込みにtry~except KeyboardInterrupt~を利用
  • 終了時にGPIO.cleanup()でリソースを解放

回路図

LEDのアノード側に220Ωの抵抗を介して3V3 (3.3V)へ、カソード側はGPIO17に繋ぐ。DavinciのLEDの定格電流は不明だが20mAとすると、この回路の場合はi = 3.3/220で15mAで定格内に納まっている。

回路組み立て

ブレッドボードにGPIO拡張ボードを挿し、Raspiと接続。

テスト

コマンドライン

RaspiのThonnyを立ち上げ、コマンドラインで以下を実行していく。

まずライブラリーのインポート。

エラーが出ず無事にインポートされたので、次はGPIOのモードをBCMにセット。

LEDのピン番号をBCMの17にセット。

GPIO17を出力用にし、初期値をHIGH (3.3V)にセット。

GPIO17の電圧レベルをLOW (0V)にセットし、LEDの点灯を確認。

GPIO17の電圧レベルをHIGHにセットし、LEDの消灯を確認。

スクリプト

とりあえず以下のスクリプトでLEDの点滅を確認。

CTRL-Cでキーボード割込みがあったときに安全に終了するための処理を導入。

SunFounderサイトではsetup()以下をif __name__ == '__main__':ブロックの中に入れているが、これはこのファイルが直接実行されたことを確認するためのもの

接続を反対にする

左記の回路ではLEDのアノード側に3.3Vを供給し、カソードを接続したGPIO17でHIGHの時にLED消灯、LOWの時にLED点灯とした。

一方、以下のようにアノード側の抵抗をGPIO17に接続し、カソードをGNDに接続しても動作させることができる。この場合、GPIO17がHIGHでLED点灯、LOWでLED消灯となる。

コードは以下の通り。GPIO.setup()ではinitialのデフォルトがGPIO.LOWとして明示的に指定していない。

 

Raspberry Pi Pico~導入

概要

Raspberry Pi Picoを導入した記録。導入済みのRaspberry Pi 4Bに接続して、RaspbianのThonnyで動作確認。

購入したもの

Rasberry Pi Pico本体と接続用のUSBケーブル。

本体はプラスチック製のパッケージに入っていて、この上から透明フィルムでカバーされていた。フィルムがケースに貼り付けられているのが両側の耳の部分だけで間はペラペラと隙間が空いていたが、これくらいでも大丈夫なくらい頑丈ということか。

Picoの本体。右側がMicoroBのUSBソケットで、その左側に白いBOOTSELスイッチとLEDがある。

Thonnyの接続テスト

ファームウェアの準備

以下の手順でThonnyの接続環境を整えた。

  1. Raspberry Pi親機を起動しておく
  2. PicoのBOOTSELスイッチを押しながら、PicoとPi親機をUSBで接続
  3. Picoがリムーバブルディスクとして認識されるのでファイルマネージャーで開く
  4. /media/pi/RPI-RP2ディレクトリーが開き、INDEX.HTMとINDO_UF2.TXTの2つのファイルが入っている
  5. INDEX.HTMをダブルクリックしてRaspberry Pi Documentationのページを表示し、MicroPythonのファームウェアをダウンロード
  6. ダウンロードされた拡張子uf2のファイルをINDEX.HTMLと同じディレクトリーにコピー

Thonny接続テスト

  1. Thonny右下のPython表示をクリックしてMycroPython (Raspberry Pi Pico)に変更
  2. 以下のコードを書いてローカルに保存、実行
  3. 点灯を確認(左下の緑色LEDが点灯している)
  4. led.value(0)に変更して実行してLEDを消灯
  5. 以下のコードでLEDのON/OFF点滅を確認

Picoの自動実行

自動実行方法

Picoにmain.pyファイルが保存されていると、電源接続後にその内容を実行する。

Thonnyを使っている場合、親機で実行確認後に同じ内容のファイルをmain.pyとしてPicoに保存する。

自動実行内容の編集・削除

main.pyを持つPicoからこのファイルを削除したり、別の内容に書き換えたい場合には、ThonnyのメニューからRunStop/Restart backendを指定。

停止後にmain.pyを削除したり書き換えた後、再度Stop/Restart backendで動作を開始させる。

注意点

BOOTSELは初期化

  • BOOTSELを押しながらPicoを接続するとPicoの内容が初期化される
  • 初期化後に環境を構築すると、以後はBOOTSELを押さずに接続してその環境で実行できる
  • 逆に言えば、BOOTSELで接続すると前の環境は消えてしまう

ファームウェアを入れるとRPI-RP2は見えなくなる

  • BOOTSEL直後はPicoがリムーバブルディスクとして/media/pi/RPI-RP2で確認できる
  • ここでたとえばMicroPythonのファームウェアを入れると/media/piの中が空になり、RPI-RP2は見えなくなる

ThonnyでPico側のファイルを確認できる

  • ただしローカルで作成したPythonコードはPicoと接続しているThonnyによってPicoに転送されている
  • これを確認するには、ThonnyをReguler modeで起動し、表示(View)でファイル(Files)をチェックする

 

Raspberry Pi~導入

概要

Raspberry Piを導入した記録。

KSYショップでRaspberry Pi 4のスターターキットを購入。OSはSDHCカードにインストール済みだったので、接続するだけで起動。OS書き込みからでもよかったが、品薄が続く中で本体購入可能なこのキットを選択。

ついでにKVMスイッチを介して、WindowsマシンとRaspberry Piを切り替えられるようにした。

購入したキット

KSYのPi4 B 4GB スターター キット 6点セット V4で、以下の内容。

  • KSY Raspberry Pi 4 Model B 4GB
  • Piケース OKdo 3ピース for 4B 透明
  • USB電源アダプター 5V 3A Type C 1.5m
  • OS書込済み Apacer microSDHC 32GB CL10 UHS-I
  • HDMIケーブル HDMI(A)-micro(D)
  • ヒートシンク 40x30x6 熱伝テープ付 for Pi

開封後のパーツ。ケースにOKdoのロゴ。

包装から出したパーツ。本体には技適マークもプリントされている。説明書は通常の注意書きレベル。

組み立て

ヒートシンク

ヒートシンクの熱伝導シートを始めにCPUに貼り付けたが、この後両面テープのヒートシンク側をはがすのに苦労した。

ケース

OKdo製のこのケースは3つに分かれている。

まず下側のケースに、コネクター位置を合わせながら本体を取り付ける。

起動

ひとまずメインマシンのモニター、マウス、キーボードを外してRaspiに接続。ACアダプターを接続して暫くすると起動。

起動後のwelcomeダイアログ。この後、locale選択や画面余白の調整などの設定へ進む。

更新にはちょっと時間がかかり、以下のようなエラーが出たがそのまま進む。更新のバージョンがstableからoldstableに変更されたということらしい。

この後KVMスイッチに繋ぎ変えて、無事にメインマシンとの切替えに成功。

コンソールからlsb_releas -aコマンドで確認したところ、OSはRaspbian GNU/Linux (buster)となっていた。