てつふくのハードウェア日記

てつふくハードウェア日記

HW設計に復帰する日を胸に、FPGA・VHDL・基板回路のことを書いていきます。立派な測定機とか、高価なライセンスとかは登場しません。

5V駆動LEDでM5StickCのGPIOポートにかかる電圧

f:id:tetsufuku81:20190914150818j:plain

製作したLED拡張基板の回路の補足です。 GPIOポートにかけてもいい電圧は最大3.3Vなんですけど、LEDの駆動電源に5Vを使ってるんですよね。この回路で本当に大丈夫なのか考察します。

tetsufuku81.hatenablog.jp

結論

結論から言うと、仮に制限抵抗が0Ωだったとしても大丈夫です。

LEDのVF(順方向電圧降下)分だけ必ず電圧が降下するから5VがGPIOピンにかかることはありません。

GPIOポートにかかる最大電圧

回路図を確認

製作したLED回路の回路図とLED周りの計算式です。
f:id:tetsufuku81:20190914143951p:plain:w280 f:id:tetsufuku81:20190914143949p:plain:w200

左側のコネクタの先で、LEDのアノードが5V電源に、カソードは制限抵抗を介してGPIO (0V/3.3V Output) につながっています。GPIOの出力がLow(0V)のときにLEDが点灯、High(3.3V)のときに消灯です。

制限抵抗がない (0Ω)のとき

回路図を少し修正しました。アノード側(図の上側)は5Vにつながっていますので、常に5Vがかかっています。抵抗は0Ωにしています。

f:id:tetsufuku81:20190914140316p:plain:w360

CN1の接続相手はハイインピーダンスとして、CN1の各ピンの電圧(=LEDのカソード電圧)を求めます。計算は簡単で、5VからVF分を引き算すれば求まります。抵抗値が0なので抵抗の存在は無視。

ロケーション LEDの色 電源電圧 (V) VF (V) GPIOピン電圧 (V)
LED4 5 1.8 3.2
LED5 5 3.3 1.7
LED6 5 3.3 1.7

表のGPIO電圧の値が制限抵抗がないと仮定した場合にGPIOの出力ピンにかかる電圧です。想定されるのははんだづけミスで短絡してたりする状況ですが大丈夫です。M5StickCは壊れません!

通常動作中の状態

制限抵抗あってGPIO出力がLow

LEDのVF分を引いた電圧(=電源電圧-LEDのVF)が抵抗にかかります。

  • 電圧が高すぎたり
  • 抵抗値が低すぎたり

して抵抗の定格消費電力を超えない限り、GPIOピンは安定してLow(0V)を出力できます。

制限抵抗あってGPIO出力がHigh

GPIOがHigh (3.3V) のときです。LEDは消灯しています。

LEDが点灯する条件は下記ですが、消灯時はこの条件を満たしていません。

  • 順方向にVF以上の電圧がかかる
  • そして電流が流れる

LEDにかかる電圧

LEDの両端にかかる電圧は、抵抗での電圧降下がないとすると  5 - 3.3 = 1.7 \mathrm{V} です。

ロケーション LEDの色 VF (V) 電源電圧 (V) GPIOピン電圧 (V) LEDにかかる電圧 (V)
LED4 1.8 5 3.3 1.7
LED5 3.3 5 3.3 1.7
LED6 3.3 5 3.3 1.7

この表のようにすべての色でLEDにかかる電圧がVFよりも低いのでどのLEDも点灯しません。

電流について

下図はこのLEDのI-V特性(電流と電圧の関係)のグラフですが、LEDにかかる電圧が低いとLEDには電流が流れないことが示されています。(LEDの一般的な特性です)

f:id:tetsufuku81:20190914143755p:plain:w300

このときLEDに電流は流れないので、同じ経路上の抵抗にも電流が流れません。そのため抵抗値にかかわらず電圧降下はゼロとなります。V = IRI がゼロなので V もゼロ。
(グラフをしっかり確認すると赤色LEDに少し電流が流れていそうですが・・・)

OutputができないM5StickCのGPIOに合わせて設計変更

f:id:tetsufuku81:20190912212553j:plain

M5StickCは壊れていない?

昨日のこの記事青色LEDを制御するGPOが壊れているのかと考えていました。

tetsufuku81.hatenablog.jp

・・・が、その後もネットで情報収集してると、G36の端子はOutputできないよというページを見つけました。

lang-ship.com

入力専用ピンだった

上記のページを見た後、必死でエビデンス(データシート)を探したけど上手く見つけられず。ただ、英語版の公式サイトには全ピンでOutputできるよと書いてある。

PWM/timer input/output available on every GPIO pin

でも、信頼と実績の非公式日本語ドキュメントでは「入力専用です」と。

GPIO36

入力専用端子で出力はできません。また、プルアップとプルダウンも利用できませんので注意しましょう。

結論。手元の実機の動作からも入力専用で間違いないです。

設計変更

現実を受け入れて設計変更します。

回路

Grove側のGPIO端子は素直に動くと書かれているので、青色制御はこちらのG32に変更します。基板とピンヘッダのままではどうにもならないのでジャンパ線で接続します。

f:id:tetsufuku81:20190912224743j:plain:w200

青色の電流制限抵抗からピンヘッダにつながっている回路を切って、ジャンパを引き出します。

f:id:tetsufuku81:20190912224828j:plain:w240

そしてジャンパの先にはピンソケットをつないで完成。ピンソケットはGrove端子へ。

f:id:tetsufuku81:20190912224851j:plain:w240

回路図の配線も修正しました。

プログラム

GPIO36ピンを設定していた部分をGPIO32ピンに変更します。

ソースコードの変更部分はこちら。

void setup() {
  // put your setup code here, to run once:
  pinMode(26,OUTPUT);
  pinMode(32, OUTPUT);    // ← この行
  pinMode(0, OUTPUT);
}

動作確認

それでは動画をご覧ください。

動作OK~!

f:id:tetsufuku81:20190912224905j:plain:w300

今後は日本語非公式ドキュメントも参考にしながら設計していきます。

エビデンスはどこ?

心残りは、結局公式的なエビデンスは見つけられなかったことです。どこにあるかご存知の方いらっしゃれば教えて・・・

M5CoreのFAQには同様の項目がありましたけど。

Q6: What special GPIO pins do you need to pay attention to in ESP32?

A6: The ESP32 has 34 GPIO pins, of which GPIO 34-39 is only used as an input and cannot be used as an output. Others can be used as both an input and an output pin.

M5StickC LED拡張基板の製作2 (実機確認)

f:id:tetsufuku81:20190911232654j:plain

MtStickC用にLED拡張基板を作った話の続きです。今日は実機で動作確認します。

tetsufuku81.hatenablog.jp

LED制御プログラム

各色を順に点灯していくプログラムを作成して書き込みます。

LED確認用のソースコード (クリックで展開します)

void setup() {
  // put your setup code here, to run once:
  pinMode(26,OUTPUT);
  pinMode(36, OUTPUT);
  pinMode(0, OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  digitalWrite(26, LOW);
  digitalWrite(36, HIGH);
  digitalWrite(0, HIGH);
  delay(500);
  digitalWrite(26, HIGH);
  digitalWrite(36, LOW);
  digitalWrite(0, HIGH);
  delay(500);
  digitalWrite(26, HIGH);
  digitalWrite(36, HIGH);
  digitalWrite(0, LOW);
  delay(500);
  digitalWrite(26, HIGH);
  digitalWrite(36, HIGH);
  digitalWrite(0, HIGH);
  delay(800);
  
  digitalWrite(26, LOW);
  digitalWrite(36, LOW);
  digitalWrite(0, HIGH);
  delay(500);
  digitalWrite(26, HIGH);
  digitalWrite(36, LOW);
  digitalWrite(0, LOW);
  delay(500);
  digitalWrite(26, LOW);
  digitalWrite(36, HIGH);
  digitalWrite(0, LOW);
  delay(500);
  digitalWrite(26, LOW);
  digitalWrite(36, LOW);
  digitalWrite(0, LOW);
  delay(500);
  digitalWrite(26, HIGH);
  digitalWrite(36, HIGH);
  digitalWrite(0, HIGH);
  delay(800);
}

書き込んだ結果

んー、青色が点灯しない。

原因調査

すぐに思い浮かんだ疑わしき点は2つ。

  1. ピン定義の間違い
  2. 拡張基板の回路設計ミスか製作ミス

ピン定義

ソースコードを確認したけど正しそう。青色はG36

void setup() {
  // put your setup code here, to run once:
  pinMode(26,OUTPUT);
  pinMode(36, OUTPUT);
  pinMode(0, OUTPUT);
}

拡張基板の回路

テスターなど測定機がないから詳しく見れないんですが、できる範囲で確認しました。
⇒ ピンセットで隣のピンとショート。

f:id:tetsufuku81:20190911233300j:plain:w300

緑を点灯させている端子と青を点灯させる端子をショートすると、青も光る。

f:id:tetsufuku81:20190911233408j:plain:w200 f:id:tetsufuku81:20190911233427j:plain:w200

(左: ショートする前、右: ショートしたとき)
しっかり青も点灯してる。。

現時点での結論

  • ピン定義も回路も正しそう
  • 前回の5VとGND短絡の影響でGPOが1端子壊れた?

ほかに思い当たるところがないか明日考えます。

ほかに思い当たらなかったらM5StickCを壊したと言うことで、「加速度センサからの値と連動」に気にせず突き進む予定です。

M5StickC LED拡張基板の製作1 (基板製作)

f:id:tetsufuku81:20190907200221j:plain 画像はイメージです。

抵抗を買ってきた

大阪日本橋共立電子でカーボン抵抗20本とライトアングルのピンヘッダを購入した。合計210円、1/4Wの抵抗は1本5円。

f:id:tetsufuku81:20190910231221j:plain:w300

配置検討

ユニバーサル基板に実際に部品を置いて配置を決める。LED、抵抗、ピンヘッダの配置イメージ。

f:id:tetsufuku81:20190910231312j:plain:w300

ユニバーサル基板はカッターナイフで傷を付けて折ったけど今回はあんまりきれいじゃない。

はんだづけ

先ほどの配置ではんだづけしていきます。背が低い部品からが基本。抵抗 → ピンヘッダ → LED の順にはんだづけしていきます。はんだごてはHAKKOのFX600-02です。末尾02が2極プラグです。(ページの最後にAmazonページへのリンク貼っときますので興味があればどぞ。)

www.hakko.com

f:id:tetsufuku81:20190910231334j:plain:w240

余った抵抗の足を使っていい感じに配線する。

f:id:tetsufuku81:20190910231402j:plain:w300

そして完成と思いきや・・・

f:id:tetsufuku81:20190910231418j:plain:w300

M5StickCに差すときの向き(裏表)を間違えないように。

f:id:tetsufuku81:20190910231959j:plain:w240
(↑この写真は後撮りなので配置は正しいです)

これを間違えると部品を全部はずしてやり直しですよ…僕みたいに。はんだ吸い取り線があればどうにかできるけどこの上なく面倒くさい。

f:id:tetsufuku81:20190910232040j:plain:w300

回路図修正(ピン振替)

LEDのデータシートをしっかり見ていればよかったんですが、緑(Green)と青(Blue)の元の回路図どおりにつなごうとすると配線がクロスしてしまいます。GPIOは割り当てを自由に変えられるので、基板側は配線しやすいように緑と青の接続先のピンを入れ替えました。

動作確認

テスターを持っていないので目視でショートの確認をしました。うん、OK。

点灯確認は、GPIOにつながるべきピン(#3, 4, 5)を一時的にM5StickCのGND(#1)に接続して光るかどうかを確認。・・・もっと落ち着いてやればいいのにここでも失敗しました。

LCDが映らなくなる

動作確認でGNDに接続するときに、M5StickCから拝借してきた5V(ピン#2)とGND(ピン#1)をショートさせてしまった。その瞬間にLCDが消えてしまって、電源を入れ直したりプログラムを書き直したりしても変わらず。

一応内部のLEDを動かすプログラムを書くとちゃんと反応してるから全体が壊れたわけではなさそう。

ツイートのとおり、テスターと実験用の電源は用意しようと思います。

M5StickCに接続してプログラムで確認

次に、GPIOを制御してLEDが点滅するプログラムを書き込んで問題ないか確認してみます。続く。

白光 ダイヤル式温度制御はんだこて FX600

新品価格
¥3,745から
(2019/9/10 23:50時点)

抵抗値のステップ(E系列)

f:id:tetsufuku81:20190909000627j:plain

電気回路の部品である抵抗(固定抵抗器)の抵抗値って飛び飛びになっていますよね。 この抵抗値のステップがどうなっているかを説明します。

結論

等比数列に基づいたE系列を採用しています。

E系列

値の一覧表は最後のほうに載せますね。
表の値に10のN乗を掛けた抵抗値が実際に作られています。

よく使われるのは

ほかにE48系列やE192系列も計算で求めることができますが、僕は製品を見たことないです。

例えばロームのチップ抵抗MCRシリーズの場合、データシートにどのE系列で抵抗値が用意されているか書かれています。(引用させてもらった製品ではE24とE96系列ですね)

f:id:tetsufuku81:20190908230822p:plain:w200

E系列の計算

各E系列の求め方は次のような方法です。

  • E3~E24系列は、1~10までを有効数字2桁で等比的に24等分した値(10の24乗根)である1.1の倍数を基調として一部を組み替えて調整したもの
  • E96系列は、1~10までを96分割の等比数列にして有効数字3桁に四捨五入したもの

また次のことが言えます。

  • E3~E24系列の有効数字は2桁で

    • E3はE6系列に内包される
    • E6はE12に内包される
    • E12はE24に内包される
  • E96系列は有効数字3桁で、E3~E24から独立しています。

欲しい抵抗値がないとき

どうしてもここにない抵抗値が必要なこともあります。

まともに1素子で実現しようとすると、特殊品となって費用も納期もかかります。 まずは、複数の抵抗の合成抵抗で欲しい値を作れないか考えましょう。

例えば、

  • 2.4と3.6を直列にして6.0 (2.4+3.6=6.0)
  • 8.2と8.2を並列にして4.1 (8.2/2=4.1)

いつもこちらのサイトの「目標の抵抗値を2本の抵抗で合成」を使わせてもらっています。

sim.okawa-denshi.jp

余談ですが、電源回路では抵抗値の比率で出力電圧を決めるんですが、ぴったりの値があることはまれで、いつも2つの抵抗から欲しい値を作っています。

E系列の数値

一覧表です。

E3・E6・E12・E24系列

E3 E6 E12 E24
1.0 1.0 1.0 1.0
1.1
1.2 1.2
1.3
1.5 1.5 1.5
1.6
1.8 1.8
2.0
2.2 2.2 2.2 2.2
2.4
2.7 2.7
3.0
3.3 3.3 3.3
3.6
3.9 3.9
4.3
4.7 4.7 4.7 4.7
5.1
5.6 5.6
6.2
6.8 6.8 6.8
7.5
8.2 8.2
9.1
10 10 10 10

E96系列

マーカー部分がE24系列との共通部分です。

1.00 1.78 3.16 5.62
1.02 1.82 3.24 5.76
1.05 1.87 3.32 5.90
1.07 1.91 3.40 6.04
1.10 1.96 3.48 6.19
1.13 2.00 3.57 6.34
1.15 2.05 3.65 6.49
1.18 2.10 3.74 6.65
1.21 2.15 3.83 6.81
1.24 2.21 3.92 6.98
1.27 2.26 4.02 7.15
1.30 2.32 4.12 7.32
1.33 2.37 4.22 7.50
1.37 2.43 4.32 7.68
1.40 2.49 4.42 7.87
1.43 2.55 4.53 8.06
1.47 2.61 4.64 8.25
1.50 2.67 4.75 8.45
1.54 2.74 4.87 8.66
1.58 2.80 4.99 8.87
1.62 2.87 5.11 9.09
1.65 2.94 5.23 9.31
1.69 3.01 5.36 9.53
1.74 3.09 5.49 9.76

参考文献

以前にも紹介した「抵抗&コンデンサの適材適所」です。

たかが抵抗かもしれませんが、背景を知って回路設計すると設計の質が上がるかもです。

抵抗&コンデンサの適材適所―回路の仕様に最適な電子部品を選ぶために

新品価格
¥1,944から
(2019/9/5 23:36時点)

M5StickCにつなぐLEDの回路

f:id:tetsufuku81:20190907200221j:plain

上の画像はイメージです。
M5StickCを動かしてみようということで、加速度センサの各軸の数値とRGB LEDを連動させてみます。

ブロック構成

f:id:tetsufuku81:20190907193132p:plain:w340

  • M5StickC の6軸IMUで、XYZ各軸の加速度を取得
  • 加速度の値を参照して、PWM制御でGPIOから出力する(平均)電圧を制御
  • GPIOで外部のLEDを制御 (GPIO出力がLのときにLEDが点灯する・・・負論理)

外部との接続はケーブルではなく、M5StickCの拡張端子に直接コネクタ付きの基板を挿す予定です。

回路図

f:id:tetsufuku81:20190907193343p:plain

一番最後にPDFの回路図もあります。

M5StickCの外部接続端子

M5StickCに外部ケーブルをつなげるコネクタは3つあります。

  1. USB Type-C・・・電源供給とPCで作ったプログラムのダウンロードに使用
  2. GROVE端子・・・GROVEシステムのモジュールを接続する4ピンの端子
  3. 拡張端子・・・2.54 mmピッチの汎用ピンソケット。これを使います

GROVEシステムについてはこちらへ。

dotstud.io

拡張端子

今回使うのは汎用の拡張端子。

ピンの説明はM5StickC本体にシールが貼ってあるのに加えて、Webの Power structure block diagram (電源構成図) が意外とわかりやすい (Pin Mapのすぐ下) 。

docs.m5stack.com

拡張端子のピンは次のようになっています。

No. 名前 内容
1 GND グランド
2 5V→ 5V出力
3 G26 GPIO
4 G36 GPIO
5 G0 GPIO
6 BAT 外部バッテリ?
7 3V3 3.3V出力
8 5V← 5V入力

以下の端子が外部に出ているから問題は無さそうです。

  • GPIOが3端子
  • 電源(3.3Vと5V)
  • GND

M5StickC以外の部品

LED

RGB LED(フルカラーLEDともいう)は手持ちの部品を探したらありました。

RODAN(ロダン)というメーカーの RT5-5818RGBW-B。Φ5の砲弾型LEDです。
アノードコモンなので、共通のアノードが1本、RGBそれぞれのカソード各1本で4本足のLEDです。

eleshop.jp

VFなどを確認

データシートで順方向電圧降下(VF)、順方向最大電流(IFM)などを確認します。IFM以上の電流を流すと壊れるので、先に確認しておきます。

LEDの色 VF (V) IFM (mA)
RED 1.8 25
GREEN 3.3 25
BLUE 3.3 25

緑と青のVFが3.3Vだったので、M5StickCからの5V電源を使うことにします。
仮に電源に3.3Vを使うと

  • LED個体のVFのばらつきで光らない
  • 電流制限抵抗にかかる電圧が低くなりすぎて、抵抗のばらつきの影響を大きく受ける

という可能性があるからやめておきます。

LED電流を決める

データシートの電流と光量の関係を示すグラフから、各色の光量が同じぐらいになるようにRGBそれぞれの電流(IF)を決めます。よくわからないので適当に25mcd狙いで電流値を決めました。

LEDの色 IF (mA)
RED 3.5
GREEN 2.0
BLUE 5.0

抵抗(電流制限抵抗)

VFとIFがわかったので必要な抵抗値を計算しました。

f:id:tetsufuku81:20190907194914p:plain:w250 f:id:tetsufuku81:20190907194923p:plain:w200

私は基本的に回路図の中に計算式を書いています。

LEDの色 電源電圧 (V) VF (V) IF (mA) 制限抵抗値 (Ω)
RED 5 1.8 3.5 910
GREEN 5 3.3 2.0 820
BLUE 5 3.3 5.0 330

部品は、手元にディスクリートのカーボン抵抗がいろいろとあるので適当に探しときます。

コネクタと基板

コネクタは2.54mmの汎用のピンヘッダ、基板はユニバーサル基板です。

回路図

ということで、改めて回路図。

製作は明日か明後日。

ラズパイとWindowsでCSVファイルを共有する方法

f:id:tetsufuku81:20190906235816j:plain

この前のもくもく会での会話のメモ。

前提

ラズパイの中にできたCSVWindowsに持ってきたい。できれば自動で。

…という相談から始まった会話。ラズパイ=Raspberry Pi

相談してくれた方

5ヶ月前に初めてラズパイを購入された初心者な方です。

  • OS (Raspbian)インストールに1ヶ月
  • Lチカに1ヶ月
  • SSH接続してコマンドを打つのに1ヶ月
  • 温度・湿度センサのはんだ付けに1ヶ月 (ここだけハードウェア)
  • センサからとりあえずデータが出てくるのに1ヶ月
  • 出てきたデータをとりあえずCSV保存 ← 今ここ

ゆっくりだけど確実に成長してる。すごい努力してるんやろうなぁ。

やりたいことと環境

  • ラズパイでPythonのプログラムを実行した結果CSVファイルが出力される
    ⇒ これをWindows側のExcelでいじくり回したいけど、ファイルを移すのが面倒くさいから自動でコピーしたい

  • ラズパイはWindows PCからイーサネットで直接接続

  • 普段は Tera Term を使ってSSHでコマンドを送受信

以上がその時聞いた全情報。

出た案

そこにいたITエンジニアの方々数人とのお話の輪に私も入ってきました。ちなみに、ハードエンジニアでIT勉強会に参加している人にはなかなか出会わない。

  1. WinSCP
  2. Samba
  3. ターミナルのリダイレクト
  4. Resilio Sync
  5. VSCP
  6. Webにアップロード (クラウド)
  7. Webにアップロード (Windows側にサーバー立てる)
  8. Cronで定期的にCSVファイルに追記← ちょっと違う

WinSCP

f:id:tetsufuku81:20190906232809p:plain:w360

ファイル転送ができるフリーソフト。Tera Term などでSSHできてるならほぼ確実に使える。ネット上に初心者向け情報多数。おすすめNo.1です。

Samba

ラズパイをファイルサーバーにしてしまう作戦。

Windowsエクスプローラで直接ラズパイの中にあるファイルが見える。設定がめんどくさいというか、ラズパイ初心者には激しく難しい。

ターミナル(シェル)でリダイレクト

ラズパイのシェルにアクセスしてcatコマンドでCSVの中身を表示しつつ、Windows側のTera Term の画面でそれをコピペで保存する。うーん、現実的ではない(WinSCP使えよと言われるでしょう)。

Resilio Sync

BitTorrentを使用したP2P
私も初めて聞いた。CSVのことは別として、なかなか便利かも。

forest.watch.impress.co.jp

以下、 Resilio Sync - k本的に無料ソフト・フリーソフト より引用

パソコン内の特定フォルダを、別のデバイス内の特定フォルダと自動で同期できるようにするソフト。 指定したフォルダの内容が、他のデバイスWindows / Mac / Linux / Android / iOS 等)内の特定フォルダと同じになるように、自動で同期処理を行えるようにしてくれます。

VSCP

ごめんなさい。私がついていけてません。

ja.osdn.net

Webにアップロード (クラウド)

f:id:tetsufuku81:20190907000401p:plain:w400

インターネット環境と保存先のサーバーがあるなら、少し勉強すればできそう。無料のレンタルサーバーを探せば費用はかからないよ。

今回の相談者さんの話を聞いていると、ラズパイとセンサで温度・湿度を単発で取得できればいいとのことなので、ちょっと豪華すぎる感。

WindowsにWebサーバーを立てて転送

さっきのクラウドにアップの別案。

たぶんだけど、WindowsにWebサーバーを用意できるスキルがあるなら黙っていろいろ実装している気がしてやまない。

Cronで定期的にCSVファイルに追記 (余談?)

ちょっと話がそれてる感ですが、

じゃあどうやって定期的にセンサーからデータを取得してWebにアップロードするよ

って話から出てきたこと。「単発でデータ取得するんなら、そのPythonスクリプトの中でアップしたらいいよね。はい終了。」って予感が無きにしもあらず。

結論

目的とやる気次第。

相談してた人は、この中のいくつかを持ち帰ったようです。

後日…

後日、「WinSCPでやってます」と報告メールをもらいました。一番平和な解決策(^^)

抵抗の消費電力

f:id:tetsufuku81:20190904234712j:plain

前回は電流制限抵抗について書いたけど、抵抗の定格消費電力に触れるのを忘れてました。

tetsufuku81.hatenablog.jp

極端な話、100V(直流)の電源でLEDを1個だけ光らせるのって大丈夫なんですかね(あとで計算してみますね)。電源電圧高め、電流大きめのときは気にしておいた方がいいです。

消費電力

消費電力の公式

消費電力の公式は


W=V*I

です。

抵抗で電力が消費されると、ほぼすべてが熱になります。そして、抵抗が耐えきれないぐらいの電力が消費されると抵抗が燃えます。

オームの法則と連携

上記の公式にオームの法則の式を代入すると、


W=I^2*R\\
W=V^2/R

のようになります。抵抗の消費電力は電流 I や電圧 V の2乗に比例して増えていくので、それなりに注意が必要です。

定格

抵抗のデータシートには定格消費電力が書いてあります。一例として、ロームの抵抗のデータシートです。

f:id:tetsufuku81:20190905225209p:plain

この値を超えると燃える、煙が出る、焦げ臭い匂いがする・・・ということが起こります。火事になったりすると非常に危ないので軽く考えたらダメです!

抵抗の種類

ざっと一覧に。数値は参考程度に見てください。

種類 定格電力[W]
カーボン抵抗 1/8~1/2
厚膜/薄膜 金属被膜抵抗 1/16~5
酸化金属被膜抵抗 1~5
セメント抵抗 2~30
ほうろう抵抗 5~100

ほかにもいろんな抵抗があります。抵抗の種類についてのおすすめの本「抵抗&コンデンサの適材適所」のリンクを一番最後に貼り付けておきますので、気になる方は見てみてください。

計算の実例

冒頭の「100Vの電源(←直流!)でLEDを駆動するとき」の制限抵抗値 R と消費電力 W を求めてみます。条件はこうです。

  • LEDの VF = 2.2 V
  • LEDの数は1個・30個・50個
  • LEDは直列接続
  • LEDに流す電流は 20 mA

LEDが1個のとき

前回と同じように計算を進めます。

  1. LEDと抵抗に流れる電流 ⇒ I = 20 mA = 0.02 A
  2. 抵抗にかかる電圧 ⇒ V - VF = 100 - 2.2 = 97.8 V
  3. 求める抵抗 ⇒ R
  4. 求める消費電力 ⇒ W

R = 97.8/0.02 = 4890 (Ω)\\
W = 97.8*0.02 = 1.956 (W)

LED 30個を直列につなぐとき

同様に30個のとき。
LEDが30個直列なので、LED全体では VF が30個と考えます。

  1. LEDと抵抗に流れる電流 ⇒ I = 20 mA = 0.02 A
  2. 抵抗にかかる電圧 ⇒ V - VF * 30 = 100 - 2.2 * 30 = 34.0 V
  3. 求める抵抗 ⇒ R
  4. 求める消費電力 ⇒ W

R = 34.0/0.02 = 1700 (Ω)\\
W = 34.0*0.02 = 0.68 (W)

LED 50個を直列につなぐとき

さらに50個のとき。LED全体の電圧降下は VF 50個分。

  1. LEDと抵抗に流れる電流 ⇒ I = 20 mA = 0.02 A
  2. 抵抗にかかる電圧 ⇒ V - VF * 50 = 100 - 2.2 * 50 = -10 V

抵抗にかかる電圧が負の数になりました。これは、LED 50個が必要としている電圧が電源電圧よりも大きいということです。仮にLED 1個あたりにかかる電圧を考えると、100/50=2(V)となります。これはVF(=2.2V)よりも低いので、LEDは光らないということになります。

どうしても50個のLEDを同じ電源で光らせたいときは、25個連なったLEDを2並列にするなどの方法があります。

まとめ

下の表のようになりました。

  • LEDの VF = 2.2 V
  • LEDに流す電流は 20 mA
  • 電源電圧 V = 100 V

のときの計算結果です。

LEDの個数 制限抵抗値 [Ω] 消費電力 [W]
1 4890 1.956
30 1700 0.68
50 - -

一般的な(ピーナツのような?)抵抗器は1/2Wとか1/4なので、この条件では使えないという判断になります。

対策として考えられることを思いつくままに書いてみると、こんな感じです。(トレードオフは考えてないし、身も蓋もないことも書きます・・・)

  • 定格電力が高い抵抗を使用する
  • VFが高いLEDに変える
  • 複数個の抵抗を並列接続して制限抵抗を構成する
  • 電源電圧を下げる
  • 降圧回路を追加して低い電圧でLEDを駆動する
  • 専用のLEDドライバICを使用する
  • PWM制御などで、電流が流れている時間を減らす(平均の消費電力を下げる)

とりあえずこのあたりで。気が向いたらそれぞれ検証するかもです。

抵抗&コンデンサの適材適所―回路の仕様に最適な電子部品を選ぶために

新品価格
¥1,944から
(2019/9/5 23:36時点)

LEDの電流制限抵抗

LED(発光ダイオード)について

LED(=Light Emitting Diode、発光ダイオード) はダイオードの一種で、ほかのダイオードと同じように一方向にだけ電流が流れます。

下図がLEDの回路図記号で、アノード(Anode)からカソード(Cathode)の方向へ電流が流れます(回路記号の三角形の向きと覚えればOK)。この方向が順方向です。
砲弾型LEDの場合は足が長い方がアノードなので、長い方を電源の+側につなぎます。

f:id:tetsufuku81:20190903223634p:plain:w200

(回路図記号・・・正確には電気用図記号と呼ぶそうです。)

計算式

抵抗値の計算方法。


R = (V-V_f) / I

電流制限

LEDの電流について

LEDの光の強度は流す電流で決まります。電圧と光の強度は直接は関係していません。実際は、電圧増加 → 電流増加 → 光量増加というふうに連動しますが。。

LEDは流す電流を大きくしすぎると壊れてしまいます。壊れなかったとしても寿命が短くなったり、まぶしすぎて目に優しくないなどあまり推奨されません。そのため、LEDに流れる電流を制限する必要があります。

その方法は、

  • LEDドライバIC
  • 定電流回路
  • 電流制限抵抗 ← この記事で説明します

などです。

下の表は、秋月電子のサイトで特性が近そうで色が違うLEDをピックアップしてきたものです。標準電流が30 mAとなっているので、実際の回路で使用するときもLEDを流れる電流が30 mAを超えないようにする必要があります。(正確にはデータシートで確認するべきです。)

型番 標準電流 VF 逆耐圧
OSR5JA3Z74A 30 mA 2.1 V 5.0 V
OSG5TA3Z74A 30 mA 3.1 V 5.0 V
OSB5YU3Z74A 30 mA 3.1 V 5.0 V
OSW4YK3Z72A 30 mA 3.1 V 5.0 V

VFはこの後で説明します。

逆耐圧は、アノードとカソードを逆につないでもこの電圧までなら逆方向に電流を流さずに耐えられますということです。それ以上の電圧を逆方向にかけると電流が流れ始めてLEDが壊れます。(多分)

VF(順方向電圧降下)

順方向に電流を流すために、LEDにある値以上の電圧(←LEDの製品ごとに決まっている)をかける必要があります。そうです、この電圧がVFです。

さっきの表にもあるとおり、LEDのVFは赤色で2V前後、青色や白色は3~3.6V程度です。

電源の電圧は少なくともVF以上は必要なので、1.5Vの乾電池1本ならでLEDを点灯させるためには昇圧回路が必須となります。

制限抵抗について

制限抵抗

電流制限抵抗ともいいます。LEDに流れる電流を制限するためにLEDに直列に接続する抵抗です。(下の回路図ではR4のこと)

f:id:tetsufuku81:20190904220443p:plain

オームの法則など

オームの法則


R = V / I

(抵抗) = (電圧) / (電流)

抵抗値を求めるには、「その抵抗にかかる電圧を、抵抗を流れる電流で割る」

キルヒホッフの第一法則(電流則)

  • 回路全体で、電流は増えたり減ったりしない
  • 枝分かれした回路に流れる電流の和は、枝分かれする前の電流と等しい

要するに、図の回路なら電源(BAT1)と抵抗(R4)とLED(D5)には同じ電流が流れるということ。

キルヒホッフの第二法則(電圧則)

  • 閉じた回路で電圧の方向を一方向に決めたとき、各素子の電圧の和は0

さきほどの図でいうと、電源(BAT1)の電圧(の和)と、負荷(R4とD5それぞれ)にかかる電圧の和が等しいということ。

計算

オームの法則と、キルヒホッフの法則で計算します。ポイントを整理します。

  • キルヒホッフの第一法則より、抵抗とLEDには同じ大きさの電流が流れる
  • データシートなどを見てLEDに流す電流を自分で決める (数mAぐらい)
  • LEDのVF(順方向電圧降下)特性より、LEDにかかる電圧はVF[V]
  • キルヒホッフの第二法則より、抵抗にかかる電圧は「電源電圧-VF」
  • 抵抗に流れる電流と抵抗にかかる電圧から、オームの法則で抵抗値を求める

ということで計算します。


使う記号を表にまとめました。

内容 記号 単位
電源の電圧 V (V)
LEDに流す電流 I (A)
LEDのVF Vf (V)
制限抵抗値 R (Ω)
  1. LEDと抵抗に流れる電流 ⇒ I
  2. 抵抗にかかる電圧 ⇒ V - Vf
  3. 求める抵抗 ⇒ R
  4. オームの法則より

R = (V-V_f) / I

複数のLEDを接続する

2個以上のLEDを1つの電源で駆動するときは直列か並列のどちらかを決める必要があります。どちらがよいかは回路全体の構成から考えた方がいいと思うので一概に言えませんが、1つの目安としてはこんなところでしょうか。

直列

  • LED間の光量のばらつきを抑えたいとき
  • 抵抗の数を減らしたいとき

並列

  • 電源電圧が低いとき

計算方法

直列

直列接続の回路図です。

f:id:tetsufuku81:20190904214843p:plain:w300

LEDと抵抗を枝分かれなく接続します。抵抗は1個でOKです。


内容 記号 単位
電源の電圧 V (V)
LED(D1およびD2)に流す電流 I (A)
LED(D1)のVF Vf1 (V)
LED(D2)のVF Vf2 (V)
制限抵抗値 R (Ω)
  1. LEDと抵抗に流れる電流 ⇒ I
  2. 抵抗にかかる電圧 ⇒ V - Vf1 - Vf2
  3. 求める抵抗 ⇒ R
  4. オームの法則より

R = (V-V_{f1}-V_{f2}) / I

並列

こちらが並列接続の回路図です。

f:id:tetsufuku81:20190904214850p:plain:w300

並列の場合は、枝分かれした後にそれぞれ制限抵抗を直列に接続します。

この回路の場合、抵抗とLEDの各ペアにはそれぞれ電源と同じ電圧がかかります。(R2とD3全体にBT2の電圧、R3とD4全体にBT2の電圧がかかる。)


内容 記号 単位
電源の電圧 V (V)
D3(左側の経路)に流す電流 I1 (A)
D4(右側の経路)に流す電流 I2 (A)
LED(D3)のVF Vf1 (V)
LED(D4)のVF Vf2 (V)
左側の制限抵抗値 R1 (Ω)
右側の制限抵抗値 R2 (Ω)

左側と右側に分けてそれぞれ計算するだけ。


[左の経路]

  1. LEDと抵抗に流れる電流 ⇒ I1
  2. 抵抗にかかる電圧 ⇒ V - Vf1
  3. 求める抵抗 ⇒ R1
  4. オームの法則より

R_1 = (V-V_{f1}) / I_1

[右の経路]

同様に


R_2 = (V-V_{f2}) / I_2

シミュレーションで確認

LTspiceでざっと確認してみました。適当にピックアップしたNSCW100というLEDに約5mAを流すための抵抗値を求めました。

LEDのVFはデータシートを見るべきなのですが、今回はシミュレーションから値を拾いました。VF=3.14Vとしています。電源電圧は12Vとしました。


R = (12-3.14) / 0.005
  = 1772

となり、約1.8 kΩの抵抗を直列に入れればよいということになります。これでシミュレーションした結果です。

f:id:tetsufuku81:20190904234049p:plain

抵抗を流れる電流が4.9mAとなっていて、求めた抵抗値は正しいことが確認できました。

M5StickCの加速度センサに連動してLEDを光らせたい

f:id:tetsufuku81:20190902213319j:plain

M5StickCの加速度センサで値を読み取って、そのXYZ方向の値に連動して外部につないだRGB LEDを制御したい。なんとなくハードルが高そうだけど、すんなりいきそうな期待を持ってスタート。

まずは加速度センサの値を取得できるか。

設計の流れ

これで動くんじゃないかという予想。

  1. 初期化する
  2. 加速度センサから値を読めるようになる
  3. LEDをON/OFF (← 前回できた)
  4. LEDの明るさをPWM制御で変える
  5. これを繰り返す

それとは別で、RGB LED周りのハードを作る必要あり。

IMUのリファレンス

Arduino APIのリファレンス。おそらくこのページを参考にすれば動きが理解できるはず。。。 (サンプルスケッチもあるのかなぁ。)

docs.m5stack.com

と思って進んでみましたがダメでした。Exampleどおりじゃ動かない。

#include <M5StickC.h>

int16_t gyroX, gyroY, gyroZ;

void setup() {
  M5.begin();
  M5.IMU.Init();
}
void loop() {
  M5.IMU.getGyroData(&gyroX, &gyroY, &gyroZ);
  M5.Lcd.setCursor(0, 30);
  M5.Lcd.printf("X:%7.2f\nY:%7.2f\nZ:%7.2f mg",
                ((float)gyroX) * M5.IMU.gRes,
                ((float)gyroY) * M5.IMU.gRes,
                ((float)gyroZ) * M5.IMU.gRes);
  delay(500);
}

IMUの型番が違うからかな。確かにM5StickCのシールをみると 6-Axis IMU MPU6886 って書いてあるのに対して、見ていたページに書いてあるのは IMU(SH200Q)

ということで、もうちょっと調べ回って↓のサイトにたどり着きました。

lang-ship.com

こっちで MPU6866 のページを参考にして、さっきのコードを修正しました。

  • 変数宣言で型を int16_t から float に変更
  • IMU のところを MPU6886 に変更
#include <M5StickC.h>

float gyroX, gyroY, gyroZ;

void setup() {
  M5.begin();
  M5.MPU6886.Init();
}
void loop() {
  M5.MPU6886.getGyroData(&gyroX, &gyroY, &gyroZ);
  M5.Lcd.setCursor(0, 30);
  M5.Lcd.printf("X:%7.2f\nY:%7.2f\nZ:%7.2f mg",
                gyroX * M5.MPU6886.gRes,
                gyroY * M5.MPU6886.gRes,
                gyroZ * M5.MPU6886.gRes);
  delay(200);
}

これをコンパイルして書き込むと・・・

f:id:tetsufuku81:20190902231028j:plain

おおぉぉ!動いたぁ!!
XYZ各軸の加速度の値が連続的に取得できてる。値が妥当かどうかはわからないけど。

この調子で次はLEDの準備をしていきます。続く。。

M5STICKC (ついでに初めてArduinoでLチカ)

f:id:tetsufuku81:20190901215455j:plain

この週末にM5STICKCなるものの存在を教えていただいたから調べてみました。 設計の仕事を離れて本当に情報に疎くなってた。自分から情報を入手しにいく習慣って大事だなと思うこの頃です。

M5STICKCは、ESP32を搭載したIoT開発基板です。スイッチサイエンスの製品ページに詳しい説明があります。

www.switch-science.com

仕様概要(気になるところ)

スイッチサイエンスのページはいい感じにまとまっています。気になったところだけ改めてあげてみます。

ESP32

データシートの5ページ目にブロック図があります。いろいろな機能ブロックが入っていてプロセッサのブロック図っておもしろいですよね。ESP32はWi-FiBluetoothに対応しているSoCです。

https://www.espressif.com/sites/default/files/documentation/esp32_datasheet_en.pdf

無線

このサイズでWi-FiBluetooth対応で、技適マークもついています。サイズも小さくて、IoTに最適だと思いました。

M5STICKCには2.4GHzのアンテナが入っていると。(高周波回路の設計大変そう。。。)

電源

電源供給はUSB-Cコネクタから。それに加えて80mAhのバッテリーが入っていますね。

電源管理IC AXP192 が搭載されているとのことですが、AXP192とは一体? 検索したら図にまとめてくださっている方が・・・すごい!

lang-ship.com

6軸IMU

6軸ってなんだ?と思って一瞬調べてみた。3軸加速度センサ+3軸ジャイロセンサ(角速度センサ)のことなんですね。設計側として加速度センサを使うの初めてなので、何かやってみよう思ってるところ。

入手先

  • スイッチサイエンス
    日本の正規代理店。この記事を書いている時点(2019/9/1)では在庫が0でした。サポート面を考えるとこちらがいいと思います。

  • 共立、マルツ、せんごく、ツクモなど
    スイッチサイエンス経由で流通しているようです。

  • アマゾン
    日本の正規代理店経由かどうかわかりませんが売られていました。キットが複数種類あるのか、腕時計マウンタが付属していないものが売られていました(2019/9/1時点)。どうしてもすぐに必要なら買ってもいいんじゃないかな。サポートが受けられるかどうかも含め自己責任ですが。

作ってみた

クイックスタート

スイッチサイエンスの製品ページの中段あたりから、資料のクイックスタートに移動して進めてみました。開発環境はArduino-Windowsです。

docs.m5stack.com

資料どおりに進めて

  • 開発環境のインストール
  • ボードマネージャインストール
  • ライブラリインストール
  • サンプルの書き込み

まで問題なし。

LEDチカチカ

こちらのWebサイトを参考にソースを書いて、デバイスに書き込んでみました。

deviceplus.jp

void setup() {
  // put your setup code here, to run once:
  pinMode(10,OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  digitalWrite(10, HIGH);
  delay(1000);
  digitalWrite(10, LOW);
  delay(1000);
}

たったこれだけです。記述量の比較対象がVHDLなので勝負にならないんですけどね。。

動作状態

こんな感じ ↓

次の案

加速度センサの値を読み取って、外部に接続したRGB LEDの色を変えるぐらいのものを作ろうかと思ってます。できるかなぁ~

2019 M5StickC ESP32 PICOミニIoT開発ボードフィンガーコンピューターカラーLCD付き (1セット)

新品価格
¥1,880から
(2019/9/1 21:40時点)

MAX10 Evaluation KitでNiosからLチカ (1)

MAX10 Evaluation Kitを使って、MAX10にNios(CPU)を作ります。そしてCPUからソフト制御でLEDを点滅させてみます。LEDが5個あるので、まずはそのうち2個をハード制御します。

f:id:tetsufuku81:20190831131034j:plain

ちなみに私のソフトのスキルはPC上でpythonをちょくちょくいじれる程度で、初ファームウェア設計です。。

冒頭に書いた通り、このボードにはユーザが制御できるLEDが5個あるので2個はハード制御、残り3個はソフト制御にします。

f:id:tetsufuku81:20190828220453j:plain:w300

www.intel.co.jp

ハード制御とソフト制御

  • ハード制御 (ハードウェア制御)
    ハード側から制御する場合は、HDL(VHDLやVerilig-HDL)で動作を記述します。 大まかにいうと、HDLのソースコードを元にツールが回路を合成します。

  • ソフト制御 (ソフトウェア制御)
    ソフトウェア制御では、FPGA上に作ったCPUに命令を実行させるようにC言語などでファームウェアを設計します。

設計の流れ

  1. 全体の仕様検討
  2. ハードウェア設計 (LED制御回路)
  3. ハードウェア設計 (CPU)
  4. ソフトウェア設計、コーディング、デバッグ

の流れで進めていきます。 全体設計 → CPU設計 → ソフト設計 の順番が入れ替わってなければ大丈夫かと。ハードウェアのLED制御回路設計はCPU&ソフトとは完全に独立して進められるので。

ブロック図

ブロック図はこんな感じです。

f:id:tetsufuku81:20190831202703p:plain:w300

(最終的には)スイッチで点滅速度を変えられるようにしようと思っているぐらいで、基本的には電源を入れるとLEDが点滅し続けるだけを考えています。なので、FPGA(とCPU)と外部のやりとりは、基板上のスイッチとLEDだけになります。

電源は基板外から供給する必要があるので、電源ケーブル(USBケーブル)だけが外につながる予定です。設計途中では、JTAGコネクタに電源の他にUSBブラスターをつないでプログラムの書き込みなどを行います。

Lチカ(HW制御)とQuartus Primeプロジェクト

VHDLソース

省略。完成品はこちら。。(準備中)

プロジェクト作成 (New Project Wizard)

開発環境にプロジェクトを作成します。まず、Quartus Primeを起動。

f:id:tetsufuku81:20190829212232p:plain

New Project Wizardをクリックしてプロジェクトを作っていきます。

f:id:tetsufuku81:20190829201507p:plain:w320

プロジェクト名を適当に決めて、Nextをクリックして進んでいきます。

下の図はデバイス選択の画面です。FPGAバイスの型番を選択してもいいんですが、隣の[Board]タブの中に使用する評価ボードが用意されていればそれを選択するとお手軽です。今回はMAX10 FPGA 10M08 Evaluation Kitが選択肢にあったのでこちらから選択しました。

f:id:tetsufuku81:20190829201546p:plain:w320

EDA Tool Settingsは今回はデフォルトのままいきます。

f:id:tetsufuku81:20190829211422p:plain:w320

サマリです。

  • Family Name
  • Device
  • Core voltage
  • Junction temperature range

も自動で設定されています。

f:id:tetsufuku81:20190829212005p:plain:w320

[Finish]をクリックして完了。

ソースファイルを追加

Quartusのメニューバーから Settingsウィンドウ を開きます。(以下のどちらか)

  • Project → Add/Remove Files in Project
  • Assignments → Settings

Categoryで File を選びます。

そして、右側の File name 入力欄の右のほうにある [...] をクリックして追加するファイルを選びます。トップのソースとLEDを点滅させるソースの合計2つを追加しました。

f:id:tetsufuku81:20190831092507p:plain:w320

PLLのIPコア作成

省略。こちらの記事が参考になります。。

tetsufuku81.hatenablog.jp

モジュール構成の認識 (Analysis & Elaboration)

ピン配置などを設定しますが、まず開発ツール側にソースファイルの構成を認識させる必要があります。

普通にフルコンパイルするか、Processing → Start → Analysis & Elaborationを実行します。(コンパイルに数時間かかるような大きなFPGAのときはフルコンパイルはやめておいた方がいいかも)

f:id:tetsufuku81:20190831093457p:plain

Analysis & Elaboration の場合は、完了すると Tasks の Analysis& Synthesis の下にあるAnalysis & Elaboration にチェックが入ります。

f:id:tetsufuku81:20190831093909p:plain

ピン配置 (Pin Planner)

トップソースで定義したポートを、デバイスのピンに割り当てます。

Pin Planner を起動します。

f:id:tetsufuku81:20190831094439p:plain

次のように設定しました。

f:id:tetsufuku81:20190831104445p:plain

設定が完了したらPin Plannerは終了しておきます。

タイミング制約

Timing Analyzer

f:id:tetsufuku81:20190831105407p:plain

Tool → Timing Analyzer か、アイコンからTiming Analyzerを起動します。

f:id:tetsufuku81:20190831110818p:plain

起動したら、Tasksの

  • Create Timing Netlist
  • Read SDC File
  • Update Timing Netlist

を順にダブルクリックして実行します。

Constraints → Create Clock の順にクリックして、Create Clockウィンドウを開きます。 Create Clockウィンドウでは次の内容を入力してRunをクリックします。

f:id:tetsufuku81:20190831111142p:plain:w320

Timing Analyzer Summaryの背景がオレンジ色になればOKです。

Tasksの一番下の Write SDC File をダブルクリックしてSDCファイルを出力します。 ファイル名が ~.out.sdc になっていますが、最終的には ~.sdc にします。 ここで出力ファイル名を変更してもいいし、Windowsエクスプローラでファイル名を変えてもいいです。

f:id:tetsufuku81:20190831111301p:plain:w320

ファイル出力ができたら Timing Analyzer を終了します。

SDCファイルに追記

出力されたSDCファイルにPLLで生成するクロックに関する記述を追記します。SDCファイルをテキストエディタで開きます。

create_clockの行は先ほど追加した内容です。それより下ならどこでもいいので、`derive_pll_clocksと書かれた行を追加します。追加したら上書き保存します。

#**************************************************************
# Create Clock
#**************************************************************
create_clock -name {clk} -period 20.000 -waveform { 0.000 10.000 } [get_ports {clk}]

#**************************************************************
# Create Generated Clock
#**************************************************************
derive_pll_clocks   # ←この行を追記する

derive_pll_clocksはPLLなどで自動生成したクロックへの制約を自動的に行ってくれるコマンドです。Timing AnalyzerのGUIからは設定できないので、テキストエディタで直接記述します。ちなみに、この`derive_pll_clocksはSDCの標準コマンドではなくアルテラの拡張コマンドです。

SDCファイルをプロジェクトに追加

SDCファイルをQuartusのプロジェクトに追加します。

Assignments → Settings で Settings ウィンドウを開いて、Categoryで Timing Analyzer を選択します。

File name 入力欄の右のほうにある [...] をクリックして、先ほどのSDCファイルを追加します。

f:id:tetsufuku81:20190831112131p:plain:w320

ファイルを追加したら、OKをクリックしてウィンドウを閉じます。

プロジェクト内のファイル(確認)

PLLも別途追加しているので、ファイルリストは↓のようになっています。参考まで。

f:id:tetsufuku81:20190831185732p:plain:w320

コンパイル

Quartusでコンパイルします。開始方法はいろいろあるのでお好きな方法でどうぞ。

  • TasksのCompile Designをダブルクリック
  • ツールバーアイコン
  • Processing → Compilation
  • ショートカットキー(Ctrl + L)

Tasksの Compile Design が緑色になってにチェックがつけば完了。

レポート確認

右のほうのコンパイルレポートで、Timing Analyzerのところが赤色になっていると思います。

Timing Analyzer → Unconstraints Path と展開して、Unconstraints Clocks が0なら大丈夫です。(出力信号にも制約をかけると赤文字はなくなるんですが、とりあえず今は大丈夫ということで)

バイスへ書き込み

コンパイルが問題なく終われば、デバイスへ書き込むためのファイルがoutputフォルダに出力されています。~.sofと~.pofです。

sofファイルとpofファイル

どちらを書き込んでも動作するんですが、

  • sofは電源オフで内容が消えます。
    デバッグやちょっとした確認したいときは、電源を落とすと書き込み内容がクリアされるので元のプログラムを汚さずに作業できます。

  • pofを書き込むと電源オフでも内容が消えません。
    次回電源投入時に自動的に書き込んだプログラムが動作します。sofより書き込み時間が長い。

Programmerの起動

以下の方法で、Programmerを起動します。

USBブラスター的なものを使って、sofファイルを書き込みました。

f:id:tetsufuku81:20190831131034j:plain:w300

f:id:tetsufuku81:20190831123551p:plain

動作確認

細かいことまで見てませんが、ちゃんと動いてます。

Django Girls チュートリアル(4) ログインページと記事作成

Django Girls チュートリアルの4回目です。
3回目はこちらDjango Girls はこちら

tetsufuku81.hatenablog.jp

今回は「ログインページを作ろう」からです。前回はブログポストのモデルを作ってデータベースにテーブルを作成したので、動作確認から始めます。

f:id:tetsufuku81:20190825195734j:plain

Django admin

adminページ作成

作成したブログポストを追加・編集・削除するためにDjango adminを使います。blog/admin.py を編集します。

from django.contrib import admin
from .models import Post

admin.site.register(Post)

モデルをAdminページ(管理画面)で見えるようにするために admin.site.register(Post)でモデルを登録しています。

admin.pyファイルの編集内容を保存したらブラウザで確認してみます。まず次のコマンドでWebサーバーを起動します。

python manage.py runserver

そしてブラウザで、http://127.0.0.1:8000/admin/にアクセスするとログインページが表示されます。

f:id:tetsufuku81:20190826221039p:plain

superuser作成とログイン

ログインするために、superuser(サイトのすべてを管理するユーザー)を作ります。

ターミナルから次のコマンドを実行します。(Webサーバーを実行しているので、新しいターミナルを起動して仮想環境に入りましょう)

(myvenv) ~/djangogirls_blog$ python manage.py createsuperuser

f:id:tetsufuku81:20190826221052p:plain
Usernameと同じPasswordを入力したら怒られた。。

ブラウザに戻ってsuperuserでログインします。Django adminダッシュボードが見えます。

f:id:tetsufuku81:20190826221108p:plain

ブログポスト作成

Posts入って、5~6のブログポスト作成します。

少なくとも 2 つまたは 3 つの記事 (すべてではない) は公開日がセットされているようにしてください。後ほど役に立ちます。

とのことなので、このブログの記事をコピペして記事を作ってみます。

記事作成中・・・ f:id:tetsufuku81:20190826222957p:plain

投稿一覧 f:id:tetsufuku81:20190826223008p:plain

コーヒーブレイク

ここでそろそろコーヒー(または紅茶)か何か食べるものを摂って自分を元気づけるのにいいタイミングでしょう。最初のDjangoモデルを作ったのだから、少し休みをとっていいところです!

と、コーヒーブレイクまですすめてくれます。
ローカル作業はここまで。次回はインターネットで動作確認していきます。

Django Girls チュートリアル(3) Djangoモデル作成

Django Girls チュートリアルの3回目です。2回目はこちら

tetsufuku81.hatenablog.jp

ブログの投稿(ブログポスト)を格納するための「オブジェクト」についてのお話から始まります。

f:id:tetsufuku81:20190815195432p:plain

オブジェクト

プログラミングには オブジェクト指向プログラミング という概念があります。 それは、退屈なプログラムを繰り返し書く代わりにモデルになるものを作って、それが他とどう作用するかを定義するという考え方です。

猫の例 (猫モデル)

サイトと同様に、猫をモデルにする場合は猫(Cat)オブジェクトを作ります。

  • 猫のプロパティは、色(color)年齢(age)機嫌(mood)(いい、悪い、眠い)、飼い主(owner)
  • 猫のアクションは、喉を鳴らす(purr)引っ掻く(scratch)餌を食べる(feed)(CatFood)

です。

f:id:tetsufuku81:20190824233238p:plain:w240 f:id:tetsufuku81:20190824233248p:plain:w240

オブジェクト指向は、実際のものをプロパティ(オブジェクト・プロパティ)と命令(メソッド)を持つコードで表現する考え方とのことです。

ブログポストの場合

ブログを作るためには、ブログポストとは何か、それはどんなプロパティがあるかを考える必要があります。(自分ではよくわかってないのでチュートリアルどおりにいきます・・・)

必要なのは、

  • コンテンツ(内容)とタイトル
  • 書いた人
  • いつ作成したか、いつ公開したか

ブログポストがどうなればいいか。ポストが公開されるといい・・・ので、

  • publishメソッドが必要

猫の例と同じようにまとめると次のような感じになります。これが次のゴール。

f:id:tetsufuku81:20190824235115p:plain:w260

Djangoモデル

Djangoのモデルはデータベースに格納されます。そこにユーザーやブログポストの情報を格納します。データベースにはSQLiteデータベースを使います。これがDjangoのデフォルトのデータベースです。

新しいアプリケーションの作成

djangogirlsディレクトリで次のコマンドを実行します。(注: 私はdjangogirlsの代わりにdjangogirls_blogフォルダで作業しています)

(myvenv) ~/djangogirls_blog$ python manage.py startapp blog

f:id:tetsufuku81:20190825005006p:plain

そうすると、以下のように新たにblogディレクトリが作成されて、ディレクトリ内にも必要なファイルができています。これでblogという名前のアプリケーションを作成したことになります。

../djangogirls_blog/
├── blog
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── db.sqlite3
├── manage.py
├── mysite
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── requirements.txt

次に、Djangoで新しいアプリケーションを使えるように設定を変更します。

テキストエディタで、mysite/setting.py を開きます。そして、INSTALLED_APPS'blog'という行を追加します。

# Application definition


INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog',
]

ブログポストモデルを作成

blog/models.py ファイルで ブログポストのオブジェクトを定義します。

テキストエディタで blog/models.py を開いて内容をすべて削除して、以下のコードを書きます。

from django.db import models
from django.utils import timezone


class Post(models.Model):
    author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
    title = models.CharField(max_length=200)
    text = models.TextField()
    created_date = models.DateTimeField(
            default=timezone.now)
    published_date = models.DateTimeField(
            blank=True, null=True)

    def publish(self):
        self.published_date = timezone.now()
        self.save()

    def __str__(self):
        return self.title

以下、内容をざっくり引用。。。

from とか import で始まる行は全部、他のファイルから何かをちょこっとずつ追加する行です。 (中略) class Post(models.Model): – この行が今回のモデルを定義します (これが オブジェクト です)。 (中略) def publish(self): は何かと言うと、 これこそが先程お話ししたブログを公開するメソッドそのものです。 (中略) メソッドは通常何かを return します。 一つの例が str メソッドにあります。 このシナリオでは、str() を呼ぶと、ポストのタイトルのテキスト(string)が返ってきます。

という感じでモデル(オブジェクト)が作成できました。

データベースにモデルのためのテーブルを作成

作成したモデルをデータベースに追加します。

まず、モデルの変更(新規作成)をDjangoに反映させるために次のコマンドを打ち込みます。

(myvenv) ~/djangogirls_blog$ python manage.py makemigrations blog

次に、Djangoが作成してくれた以降ファイルをデータベースに追加して完了です。

(myvenv) ~/djangogirls_blog$ python manage.py migrate blog

f:id:tetsufuku81:20190825011959p:plain

以上でポストモデルがデータベースに入りました!次回、どうなったか見てみます。

入門におすすめのFPGA評価ボード

評価ボードFPGAの勉強を始めたから実際に基板がほしい。
でも種類が多いし、値段は高いし、どれがいいのか悩む・・・、という方に参考になりそうな内容を整理します。(2019年夏の時点での情報です)

f:id:tetsufuku81:20190824182824p:plain

MAX1000がおすすめ

いきなり結論ですが、アルテラのMAX10が実装されているMAX1000がおすすめです。 価格は3,000円程度で、USB接続するだけで電源供給とFPGAへの書き込みとができます。サイズもコンパクトです。

f:id:tetsufuku81:20190609105833j:plain

Electronic Components Online | Find Electronic Parts | Arrow.com

MAX1000 Arrow Development Tools | 評価開発ボードおよびキット | プログラマブルロジック開発ボード・キット | Arrow Development Tools - チップワンストップ 電子部品半導体通販サイト

選定基準

価格と入手性で選びました。

あとは、入門用ということで「手軽に使える」という点です。逆に「何でもできる」高価な評価ボードもありますが、ステップアップしてから考えればいいと思います。

LEDを点滅させて動作を確認するのがいいと思いますので、LEDが多い基板を選ぶと楽しいかも。LEDとスイッチは他の基板を選んでも載っていると思うので、スイッチON/OFFでLEDを制御して確認していくと楽しいと思います。LEDを使わないとなるとオシロスコープを使って波形を確認とかになるので大変です。

評価ボード購入のススメ

実機で動作確認できる

これが実機を購入する最大の目的で、購入をお勧めする最大の理由です。

入門本を見て学習を進めているうちはシミュレーションで動きを見て納得。そこで完結してもいいんですが、自分で何かを作りたいと思えたなら実機でLEDを点滅させたり、スイッチを触ってみて慣れてしまうのが近道だと思います。

ドキュメント類が手に入る

評価ボードを購入すると(製品によっては購入しなくても)、回路図や部品リスト、基板のパターン図などをダウンロードすることができます。MAX1000は購入前から情報入手できましたが。

例えば回路図が入手できると、FPGAの内部回路を設計するだけではなく、周辺の基板回路がどうなっているかも調べることができます。FPGAとRAMやROMとの接続、電源回路、IO回路などです。

モチベーション維持に

これは人によりますが、購入してしまった以上やるしかないと思えるタイプなら強力なモチベーション維持になります。コンパクトで見た目がきれいな基板もあるので、あまり怖がらずに手を出してしまうのもありと思います。

仕様面からの選定

搭載FPGA

現在普通に入手できるものなら何でもいいと思います。価格も含めると現実的には、アルテラのMAX10かCyclone10、ザイリンクスのZynqあたりになりそうです。

PCとの接続

1つのUSB接続でJTAGと電源供給ができたら便利です。

別々の場合はケーブルが2本必要で煩わしいし、プログラミング用のケーブルを別途購入しないといけない場合があります。(評価ボード上にプログラミング用回路が載っている場合は専用ケーブルは不要ですが・・・そういう基板はほぼ電源と共有のUSBです。)

私が持っているMAX10 Evaluation Boardは、基板上のUSBコネクタは電源共有専用でプログラムの書き込みはできませんでした。なので、USBブラスター的なものを購入するか自作する必要がありました。結局自作しましたが、それまではただ電源が入るだけのボード、それ以上でも以下でもなかったです。

tetsufuku81.hatenablog.jp

FPGA周辺回路

基板上にFPGA以外にどんな部品が実装されていればよいかを考えます。 LEDとスイッチ類(スライドスイッチやプッシュスイッチ)、拡張用コネクタがあればいい感じです。とはいっても、「FPGAとLEDしか載っていない評価ボードってあるの?」ってぐらい何かは実装されているのであまり気にしなくてもいいと思います。

ほかにはデータを保存しておくためのフラッシュROM、RAMもあります。クロック源(水晶発振器など)も1つか2つ実装されていると思います(クロックがないとFPGAなどデジタル部品が動けないので)。

ということで、「何でもできる」を求めていない今は深く気にしなくてもいいと思います。

最新デバイスがいい?

基本的には、最新というより市場によく流れているもの、つまり普通に入手できるものでいいと思います。

あまりにも古いデバイスは評価ボード自体が生産中止や在庫切れ入手が難しいかなと思います。逆に、メーカーが供給を開始して間もないぐらい新しいデバイスを考えると、メーカー純正品のような高価な評価ボードしかなく、途中で行き詰まっても解決策の入手が難しいです。そもそもFPGA設計の情報はWebで探してもなかなか見つからないんですよね。特に日本語では。

決め手は価格と入手性でいいと思う

上記を総合して、私のおすすめはMAX1000です。価格は3,000円以下ですし、ネット注文で普通に買えます。

2011年頃なら同じ理由でSpartan-6 LX9 MicroBoardをおすすめしたんですが、さすがに現在では入手できなさそうでした。性能は安定していていいボードでした。

ここでは、MAX1000をおすすめはしていますが好みで選ぶのもいいと思います。愛着がある方がいいです。例えば次のようなところで探せます。

Digilent
Xilinx FPGA Development Boards and Dev Kits - Digilent

ストロベリー・リナックス
ザイリンクス - 製品一覧 - ストロベリー・リナックス

マルツ
CPLD・FPGA/開発ツールの通販 マルツオンライン

秋月電子
半導体/CPLD・FPGA 秋月電子通商-電子部品・ネット通販

メーカーにはこだわらなくてOK

FPAGの2大メーカーといいえば、アルテラとザイリンクス。アルテラはインテルに買収されてインテルになりました。ほかにラティスセミコンダクターなどがありますが、今の段階であえて選ぶ必要はないと思います。

アルテラ、ザイリンクスともにWindowsLinuxで動作するフリーの開発環境があります。(アルテラはQuartus Prime、ザイリンクスはVivado)。両社ともに各開発環境で使用できるフリーのロジックシミュレータも提供してくれています。

おすすめはMAX1000

せっかくこの記事にたどり着いてくれたのなら、悩むぐらいならMAX1000を買ってしまいませんか。わからないことがあれば私でよければフォローしますので。 自分が書いたハードウェアが動作するとうれしいですよ。PCからダウンロードしているときのドキドキと、コンフィグ完了しても動かないときの落胆を笑

www.arrow.com

www.chip1stop.com

おまけ

開発言語について

Verilig-HDLかVHDLかもこだわらなくていいと思っています。迷っているならVHDLにしておけばいいかなと。記述量は増えるけど厳密に記述しないとコンパイルエラーが出てくれて、意図しない動きを減らせると思います。

私が持っている評価ボード

MAX1000

アルテラのMAX10が使えるおすすめボード。安価でコンパクトだし、USBでプログラムを書き込めて電源供給もされる。

Electronic Components Online | Find Electronic Parts | Arrow.com

PYNQ

ザイリンクスのZynqが使えるボード。PythonFPGAを動かそうと思って購入した。今のところ優先度低め。

www.pynq.io

MAX 10 FPGA Evaluation Kit

アルテラのMAX10が使えるボード。1年か2年前に、DigiKeyで安かったから買ってみた。電源はUSB接続、PCとの接続はJTAGコネクタで不便。Arduinoのシールドを取り付けられるコネクタ配置なので拡張の余地あり。

MAX 10 FPGA 評価キット

MAX V CPLD Development Kit

アルテラのMAX V CPLDが使えるボード。持ってるはずだが見当たらない。大したことはできないと記憶。

MAX V CPLD 開発キット

ZedBoard

ザイリンクスのZynqが使えるボード。前の会社を退職するときに同僚にあげました。使ってくれてるかなぁ笑

https://japan.xilinx.com/products/boards-and-kits/1-8dyf-11.html

Spartan-6 FPGA LX9 MicroBoard

ザイリンクスのSpartan-6が使えるボード。デバイスが古いけど、MAX1000同様でコンパクトで便利。ちょっとしたときに治具のように使ってたり、インターンシップのネタにして学生さんに触ってもらったりもした。

https://www.avnet.com/opasdata/d120001/medias/docus/1/Xilinx_s6-lx9-microboard-pb020411.pdf