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

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

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

はてなブログの個別記事を転送

f:id:tetsufuku81:20190930220102j:plain

はてなブログからWordPress

少し前からブログの引っ越しをしています。URLの転送に関してメモを残します。

はてなブログからWordPressへの移行に関しては、皆さま同じ悩みを乗り越えていっているようで。。かなり勉強になります。

下記サイトをはじめ、いろいろと参考にさせていただいています。

www.cg-method.com

方針

僕もヘッダに転送用のスクリプトを仕込んでブログ全体を転送しようと思っていたのですが方針を変えました。。

記事ごとに別々のページに転送をかけることにしました。

結局のところ移転先では手作業で画像などを修正しているので、作業が終わった記事から順にはてな側に個別の転送スクリプトを貼り付けていっています。

個別記事の転送方法

こちらのサイトをすごく参考にさせていただいています。

www.cucumberking.com

サイトに書かれているように「entry」という文字列がポイントのようです。

はてなブログ」では個別の記事ではURLに「entry」という文字列が含まれます。 これを利用して下記のスクリプトのように正規表現にマッチングさせて個別の記事でのみ実行されるようにすれば良いそうです。

転送用のコード

ということで、以下のコードをマークダウンまたはHTML編集モードで記事の先頭に貼り付けています。例えば、次のページには以下のコードが書かれています。

tetsufuku81.hatenablog.jp

<div style="border: 1px solid #0000cc; padding: 1em; margin-bottom: 0.8em; font-size: 1.1rem;">
<p>本記事は移転しました。</p>
<p>約10秒後にリダイレクトします。</p>
<p>リダイレクトしない場合は<a href="https://tetsufuku-blog.com/resistance-value-step/">ここ</a>をクリックしてください。</p>
</div>
<script type="text/javascript" language="javascript">
<!--
  // 現在のurl
  var href = window.location.href;
  // 記事ページのurl正規表現
  var re = new RegExp(".*entry.*");
  if (re.test(href)) {
    // 新url
    var url = "https://tetsufuku-blog.com/resistance-value-step/";
    // link rel="canonical" の変更
    // 「はてなブログ」ではheadタグの最初のlinkタグに以下がある
    // <link rel="canonical" href="xxx"/>
    var link = document.getElementsByTagName("link")[0];
    link.href = url;

    // リダイレクト
    setTimeout("redirect()", 10000); // 10 sec
    function redirect(){
      location.href = url;
    }
  }
-->
</script>

最後に

引き続き移行作業をしています。

まだこちらも残しておきますが、新サイトにもぜひお越しください。

tetsufuku-blog.com

ブログ引っ越し中です

本記事は移転しました。

約10秒後にリダイレクトします。

リダイレクトしない場合はここをクリックしてください。

f:id:tetsufuku81:20190926010005j:plain

最近新しい記事を書けていなくてすいません。 それでも見に来ていただいていて本当にありがとうございます。

ブログ引っ越し

今、WordPressにブログの引っ越しをしています。

こちらです。

tetsufuku-blog.com

まだ非公開にしていたり画像がうまく見えていないところもありますが、頑張って進めていきます。見にくいところが多々あって申し訳ありませんが、温かく見守っていただけると幸いです。

  • じわじわと公開記事が増えていきます
  • 現時点ではnoindexに設定しています

移行作業

記事の移動

パーマリンクを投稿名にしたかったのではてなブログのエクスポートは使いませんでした。

その代わりに、はてなブログを書き始めたときからマークダウンのテキストを別途保存していました。これを使ってWordPressに記事を投稿していきました。 50記事くらいありましたが、流れ作業的にペタペタ貼り付けていたら終わっていました。

画像の移動

はてなブログに掲載している画像は、はてなフォトライフに保存されています。

僕はブログ記事と同じように投稿画像をローカルで投稿ごとに分けていました。そのWordPressの記事に順番に画像を挿入していっている途中です。

アイキャッチも同じです。

ソースコードの移動

VHDLArduinoソースコードを貼り付けている記事もあります。

はてなブログではシンタックスハイライトが楽ちんだったんですが、WordPressへはそのままきれいに移行できません。

WordPressプラグインを入れると対応できるとうのもわかったのですが、できるだけプラグインを少なくしたいので、プラグインは導入しませんでした。

なので、ソースコードGitHubのGistを使って掲載しています。

修正 (文章リライト&CSSカスタマイズ)

記事の修正

前項の移転作業は避けて通れないので黙々と作業を進めました。

作業を進める中で気になりだしたのが、過去に書いた記事の文章が読みにくいこと。

  • 構成がよくわからない
  • 見出しがなく、ダラダラ書いている
  • リストが周りの文章に埋もれていて、大事なところがわからない
  • 結論がない

などいろいろあります。目に余るところは修正しながら記事を公開していっています。

カスタマイズ

WordPressの見た目のカスタマイズもやっています。気になるところをWebで調べて触っています。

  • フォントを変えたり
  • リストを囲ったり

ブログの引っ越しが落ち着いた時点で振り返りたいと思います。

転送方法の検討

はてなブログからの転送をどうしようかと考えています。

移行に関しては経験者のブログなどを参考にさせていただいていますが、パーマリンクの構造をガラッと変えている事例を見つけられていません。

JavaScriptで転送することになるんですが、ほとんど知識がないです。

元のアドレスで場合分けして、新しいアドレスにジャンプするぐらいしか今ある知識では出てきません。まずはやってみます。

感じていること

数ヶ月前に書いた文章がすごく読みにくい。

だからといって、数ヶ月でライティング力が向上したとは思えないですけど。ただ、良くない記事に気付ける視点が身に付いたことは間違いないと思います。

これからもブログ先輩の皆さまの記事に勇気をもらいながら続けていこうと思います。

ライティング力強化と長期継続とTwitterを上手に使えることが目標です。

参考にさせていただいた記事

はてなブログからWordPressへ引っ越し! 最新の移行手順をまとめる(エックスサーバー編)

sakagami3.com

SEO的にもOK】はてなブログでリダイレクト設定をする方法【JSリダイレクト】

naoyu.net

はてなブログから引越し後のはてなブログのリダイレクト設定方法

www.haneda-airport-server.com

ブログ移転時必見!はてなブログ(無料)からリダイレクトをする簡単で効果的な方法!

beiznotes.org

WordPress記事の自作目次のHTMLとCSS

本記事は移転しました。

約10秒後にリダイレクトします。

リダイレクトしない場合はここをクリックしてください。

f:id:tetsufuku81:20190919231711j:plain

WordPress初心者の僕ですが試行錯誤しながらはてなブログから移行作業中です。

そのなかで記事ごとの目次を作りたくていろいろ調べて、どうにか形になりました。プラグインを使うと遅くなるというアドバイスも多くありますし、できるところは自作しようというスタンスです。

僕と同じ初心者で目次をどうしようかと思っている人の参考になればうれしいです。(そして自分用のメモでもあります。)

完成イメージです↓
f:id:tetsufuku81:20190919234822p:plain:w380

目次のテキストと動作を設定

コードエディタで記事を編集

HTMLタグを使って目次を書くので、WordPressのエディタはコードエディタを使います。

投稿画面の右上[…]が縦に向いているボタンから、コードエディタを選択します。

f:id:tetsufuku81:20190919233904p:plain:w260

HTMLタグ記入

目次を置きたい場所に以下の手順でHTMLを書いていきます。

見出し(h2, h3, h4) をピックアップ

本文で見出し(h2, h3, h4)を使っているので、それを目次の項目にします。

h4は使わないときもあるので、必要に応じて目次の項目数は考えるようにしています。

今回はh2h4を使います。各見出しの内容を1箇所に集めておきます。

[h2]
目次のテキストと動作を設定

[h3]
コードエディタで記事を編集
HTMLタグ記入

[h4]
見出し(h2, h3, h4) をピックアップ
リスト(箇条書き)を作成
アンカーを追加

リスト(箇条書き)を作成

ulliを使って先ほどの見出しをリストにします。
まずはh2から見出しの内容を書きます。見出し内容の前には数字を書いておきます(手動で)。

<ul>
  <li>1. 目次のテキストと動作を設定</li>
</ul>

次に、h3h2の下に入れ子にします。

<ul>
  <li>1. 自作目次のコーディング</li>
  <li>
    <ul>
      <li>1-1. コードエディタで記事を編集</li>
      <li>1-2. HTMLタグ記入</li>
    </ul>
  </li>
</ul>

同じく、h3の下にh4です。

<ul>
  <li>1. 目次のテキストと動作を設定</li>
  <li>
    <ul>
      <li>1-1. コードエディタで記事を編集</li>
      <li>1-2. HTMLタグ記入</li>
        <ul>
          <li>1-2-1. 見出し(H2, h3, h4) をピックアップ</li>
          <li>1-2-2. リスト(箇条書き)を作成</li>
          <li>1-2-3. アンカーを追加</li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

これでリストが作成できました。
これを表示するとこのようになります。不細工ながら、形になってきました。

  • 1. 目次のテキストと動作を設定グ
    • 1-1. コードエディタで記事を編集
    • 1-2. HTMLタグ記入
      • 1-2-1. 見出し(H2, h3, h4) をピックアップ
      • 1-2-2. リスト(箇条書き)を作成
      • 1-2-3. アンカーを追加

アンカーを追加

目次のテキストをクリックしたら該当する見出しにジャンプするようにします。

aタグを使います。目次のテキストにはaタグでハイパーリンクを設定しておき、見出しにはidを付けておいてジャンプ先を区別させます。

idは重複しないように機械的に決めました。先ほどのリストで先頭に付けた番号をidに使います。

次のように、li/liの間のテキストに<a href="#anker1">ハイパーリンクを設定します。

以下、煩雑なので説明ではh4は省略します。

<ul>
  <li>1. <a href="#anker1">目次のテキストと動作を設定</a></li>
  <li>
    <ul>
      <li>1-1. <a href="#anker1-1">コードエディタで記事を編集</a></li>
      <li>1-2. <a href="#anker1-2">HTMLタグ記入</a></li>
    </ul>
  </li>
</ul>

リスト側はこれでOKです。

引き続いて、本文に散らばっている見出し(h2h4)にidを設定します。

h2(h3, h4)の開始タグにid=と書いて、リスト側と対応するidを設定します。idは重複しないように注意。

<h2 id=”anker1”>目次のテキストと動作を設定</h2>

~~(ブログの文章)~~

<h3 id=”anker1-1”>コードエディタで記事を編集</h3>

~~(ブログの文章)~~

<h3 id=”anker1-2”>HTMLタグ記入</h3>

~~(ブログの文章)~~

表示すると、リスト側はこうなっています。

(ジャンプ先が存在しないのでクリックしても何も起こりません。)

見出しの見た目は変わらないので省略します。

目次タイトルを追加

目次のタイトルを追加します。「目次」にしました。

pタグで囲い、idとしてtoc_titleを設定します。CSS要素を特定するためのidです。リストの前に追記します。

<p id="toc_title">目次</p>
<ul>
  <li>1. <a href="#anker1">目次のテキストと動作を設定</a></li>
  <li>
    <ul>
      <li>1-1. <a href="#anker1-1">コードエディタで記事を編集</a></li>
      <li>1-2. <a href="#anker1-2">HTMLタグ記入</a></li>
    </ul>
  </li>
</ul>

目次の領域を追加

divで目次の領域をつくります。CSSで枠を付けると、この領域が囲まれます。pと同様にCSS用のidとしてsitemap_listを設定しておきます。

<div id="sitemap_list">
<p id="toc_title">目次</p>
<ul>
  <li>1. <a href="#anker1">目次のテキストと動作を設定</a></li>
  <li>
    <ul>
      <li>1-1. <a href="#anker1-1">コードエディタで記事を編集</a></li>
      <li>1-2. <a href="#anker1-2">HTMLタグ記入</a></li>
    </ul>
  </li>
</ul>
</div>

目次をクリックしたときの動きの記述は以上で完了です。目次機能ができました。

必要に応じて記事を保存したり、続きを記入しましょう。

目次外観を設定

続いては、見た目を変化させるためにCSSを編集します。

WordPress外観のカスタマイズ

CSSの記入場所は、外観のカスタマイズにある追加CSSの中です。

f:id:tetsufuku81:20190919234208p:plain:w260
f:id:tetsufuku81:20190919234217p:plain:w240

CSSを編集

順を追って記述していきます。

  • リストの点を消す
  • 左のpaddingを0にする
  • h3とh4は字下げする
  • タイトル「目次」を記入する
  • 枠を装飾する

リストの点 (・) を消す?

通常は以下の記述で消えますが、ストークの点は消えませんでした。(いきなりつまずく・・・)

↓この記述は追記不要です。ストークでは効果ないです。

ul {
  list-style: none;
  padding-left: 0;
}

それでもネットの力、先人の知恵。同じように悩んだ人がたくさんいるらしい。素晴らしい先駆者が対策を書いてくれていました。

keiichinishimura.com

何が起こっているかというと、「・」を消そうそしてもテーマとの干渉かなにかで消えないんです。ストークとかハミングバードで発生するとのことです。

f:id:tetsufuku81:20190919234459p:plain:w300

対策としては、「・」を消すのではなく、「・」が表示されている場所のサイズをゼロにして隠してしまうというイメージです。次の項目がその対策。

リストの点 (・) を隠す

疑似要素beforeを使って「・」が見えないようにしてしまいます。

#sitemap_list li:before{
  width: 0;
  height: 0;
}

f:id:tetsufuku81:20190919234639p:plain:w300

H3とH4は字下げする

h3h4をそれぞれ字下げして構成を見やすくします。

#sitemap_list li.level_h3 {
  padding-left:2em;
}
#sitemap_list li.level_h4 {
  padding-left:3em;
}

f:id:tetsufuku81:20190919234733p:plain:w300

タイトル「目次」を装飾する

「目次」という文字の左からの距離を調整します。。さらに文字の下方に横線を引いて、目次本体とタイトルを区別します。

p#toc_title {
  padding-left: 2em;
  border-bottom: 1px solid #eaf3ff;
  padding-bottom: 10px;
}

f:id:tetsufuku81:20190919234926p:plain:w360

枠を装飾する

最後に目次を囲む枠線を設定します。

  • 線の種類、太さ、色
  • 枠線から目次のテキストまでの間隔の調整
  • 枠線外部の空間の調整
div#sitemap_list {
  box-sizing: border-box;
  border: solid 1px #516ab6;
  margin: 1em;
  width: 80%;
  margin-left: auto;
  margin-right: auto;
  padding: 1em;
  margin-bottom: 3em;
}

f:id:tetsufuku81:20190919234822p:plain:w360

以上で完成です。

実際のWordPressポスト

作成中のWordPressへのリンクです。(まだ noindex を設定で運用)

tetsufuku-blog.com

【参考】WordPressの目次プラグイン

どうしても面倒くさいという方はプラグインも選択肢とは思います。

Table of Contents Plus

ja.wordpress.org

Easy Table of Contents

ja.wordpress.org

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系列)

本記事は移転しました。

約10秒後にリダイレクトします。

リダイレクトしない場合はここをクリックしてください。

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ファイルを共有する方法

本記事は移転しました。

約10秒後にリダイレクトします。

リダイレクトしない場合はここをクリックしてください。

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でやってます」と報告メールをもらいました。一番平和な解決策(^^)

抵抗の消費電力

本記事は移転しました。

約10秒後にリダイレクトします。

リダイレクトしない場合はここをクリックしてください。

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の電流制限抵抗

本記事は移転しました。

約10秒後にリダイレクトします。

リダイレクトしない場合はここをクリックしてください。

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)

本記事は移転しました。

約10秒後にリダイレクトします。

リダイレクトしない場合はここをクリックしてください。

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

https://www.intel.co.jp/content/www/jp/ja/programmable/products/boards_and_kits/dev-kits/altera/kit-max-10-evaluation.htmlwww.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

動作確認

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