Hatena::ブログ(Diary)

滴了庵日録 このページをアンテナに追加 RSSフィード

2017/08/10(Thu)

LPCXpressoでのRAMブロック指定

LPCマイコンのたとえばLPC1549は、合計36kバイトのSRAMを持っていますが、16kバイト/16kバイト/4kバイトの3つのブロックに分かれています。第一のブロック以外は、省電力のために個別にディセーブルすることが可能です。LPCXpressoでソフトウェアを開発する場合、変数は通常は第一のブロックに配置されます。


しかし、第一のブロックの容量をオーバーする場合はどうすればよいでしょうか?

Memory region         Used Size  Region Size  %age Used
       MFlash256:       46848 B       256 KB     17.87%
         Ram0_16:       17640 B        16 KB    107.67% ←容量オーバー
         Ram1_16:          0 GB        16 KB      0.00%
          Ram2_4:          0 GB         4 KB      0.00%
make: *** [Hoge.axf] Error 1


LPCXpressoでは、変数(グローバル変数および静的ローカル変数)を特定のブロックに配置するためのマクロが用意されています。これを使うためには、下記のヘッダをインクルードします。

#include <cr_section_macros.h>


初期値なし変数の配置を指定するには、__BSS(ブロック名)マクロを変数の宣言時に使用します。ブロック名は、第二のブロック以降を RAM2, RAM3,...のように指定します。初期値あり変数の場合には、__BSS(ブロック名)マクロのかわりに、__DATA(ブロック名)マクロを用います。

// 送信バッファ
__BSS(RAM2) static uint8_t txBuffer[1024];


これらのマクロを用いることで、第二ブロック以降の領域を活用することができます。

Memory region         Used Size  Region Size  %age Used
       MFlash256:       46848 B       256 KB     17.87%
         Ram0_16:        6952 B        16 KB     42.43%
         Ram1_16:       10688 B        16 KB     65.23% ←こっちに移った
          Ram2_4:          0 GB         4 KB      0.00%
Finished building target: Hoge.axf


【参考URL

2017/07/29(Sat)

ESP32のフラッシュメモリの読み書き

ファームウェアバックアップ

ESP32のファームウェアはフラッシュメモリの0番地からの領域に格納されます。ここでは0番地から400000hバイト(4Mバイト)を読み出してバックアップファイルを作ります。

esptool.exe -c esp32 -p COM3 -b 115200 read_flash 0 0x400000 esp32_firmware.bin

バックアップしたファームウェアの書き込み

esptool.exe -c esp32 -p COM3 -b 115200 write_flash 0 esp32_firmware.bin

ユーザーデータの書き込み

100000h番地(0番地から1Mバイトめ)からの領域にバイナリデータを書き込みます。

esptool.exe -c esp32 -p COM3 -b 115200 write_flash 0x100000 data.bin

2017/07/26(Wed)

いまさらTWELITE

数年前、TWELITE (旧称 TWE-Lite、例のマッチ棒アンテナのやつ) ていう無線マイコンモジュールが流行ったことがあって、でも最近あんまり聞かないなと思ってたんですが、ちょっと縁があって触ってみることになりました。

やりたいこと

  • PLC(シーケンサ)をコントローラとして、おもちゃを無線でコントロールする。
  • マイコンのプログラミングは不要であることが望ましい。
  • おもちゃに組み込むので、なるべく小型であること。
  • おもちゃに組み込むので、なるべく低消費電力であること。

このためのソリューションとして、TWELITEはど真ん中ではないかと考えました。

TWELITEとは

写真 写真

  • ZigBeeベースの無線マイコンモジュール
  • マッチ棒アンテナ
  • 約14mm角の小ささ (DIP基板のTWELITE-DIPもある)
  • 動作電圧は2.0〜3.6V (乾電池駆動も可)
  • プログラミングなしでもデジタル/アナログの信号を無線化できる。
  • 自分でプログラミングも可能

プログラミング不要

TWELITEは自分でプログラムしなくても、プリセットファームウェアTWELITE標準アプリ」で、デジタル/アナログの信号を親機/子機間で無線伝達できます。

図

上図のように信号が伝達されます。

  • 親機のデジタル入力が子機のデジタル出力に
  • 子機のデジタル入力が親機のデジタル出力に
  • 親機のアナログ入力が子機のPWM出力に
  • 子機のアナログ入力が親機のPWM出力に

親機と子機

「TWELITE標準アプリ」では、親機/子機の設定は専用の設定ピンでおこないます。(詳細はこちら) 親機/子機のペアリングは不要です。というか、ブロードキャストです。「ゆるふわ」な電子工作むけな仕様です。ブレッドボードで実験してみましたが、すごく簡単です。

写真

設定変更

「TWELITE標準アプリ」でもちゃんとペアリングというかグループ化したい場合は、設定変更(インタラクティブ)モードで設定できます。TWELITE-DIPの設定変更をするには、TWELITE-Rを用いてPCに接続します。TWELITEモジュールの設定変更をしたい場合には、こちらの信号ピン対応表どおりに結線すればTWELITE-Rが使えるでしょう。

写真

設定はTeraTermなどのターミナルでおこないます。ボーレート115200に設定して接続します。'+'(プラス記号) を3回、一呼吸(0.2〜1秒間隔)置きながら入力すると設定変更モード(インタラクティブモード)に入ります。


グループ化をおこなうには、アプリケーションIDを変更するか、チャンネルを変更します。

アプリケーションID

アプリケーションIDは32ビット値で、この値が同じデバイス同士で通信が行われます。親機のSIDの値をアプリケーションIDとして、親機・子機すべてに設定すればよいでしょう。デバイスのSIDはインタラクティブモードに入ったときに表示されます。

チャンネル

チャンネルとは、いうまでもなくZigBeeのチャンネル設定です。11〜26までの16通りが選べます。親機・子機すべてに同じ値を設定します。

RC専用アプリ

TWELITEには、プリセットの「TWELITE標準アプリ」以外にもMW-APPSとよばれるいくつかのファームウェアが提供されていて、binファイルをダウンロードできます。その一つがラジコンに特化した「RC専用アプリ」です。サーボモータの制御やDCモータの回転スピードや正逆転制御がおこなえます。これを使うのも一つの選択肢かもしれません。

ファームの書き換え

ファームウェアの書き換えは、TWELITE-RとTWELITEプログラマで行います。TWELITEプログラマWindows専用のGUIツールです。CUIツールのjenprogプログラマはWindows, Mac, Linuxに対応しています。TWELITEプログラマを使う場合は、COMポートを選択して、ファームのbinファイルをドラッグアンドドロップするだけです。

2017/07/22(Sat)

毎日決まった時刻にAndroidの画面をオフする方法

Androidタブレットを展示用のディスプレイとして用い、展示を終了する毎日決まった時刻に自動で画面をオフする方法を検討しました。(画面オンは毎朝手動で。電源はUSBで常時給電。)

  • 画面をオフするアプリ 「Screen Off and Lock」
  • 指定の時刻にアプリを起動するアプリ 「Phone Schedule」

この2つを組み合わせることで実現します。

ディスプレイのスリープを無効に

まず、一日じゅう展示を続けるために、ディスプレイのスリープを無効にしておきます。

Androidの「設定」→「ディスプレイ」→「スリープ」で「使用しない」を選択します。

Screen Off and Lock のインストールと設定

図

  • Screen Off and Lock をインストールします。
  • とくに設定の変更は必要ありません。「Screen Off」をタップすると画面がオフします。
  • 「Screen Off and Lockの設定」をタップすると、画面オフの時のアニメーションや効果音、バイブレーションなどを設定することができます。

Phone Schedule の インストールと設定

図

  • Phone Schedule インストールします。
  • 「Phone Schedule」をタップして設定画面を起動します。
  • 「+ Add new task」をタップしてタスクを作成します。
  • 「Time」で時刻を設定します。ここでは17:00に設定します。
  • 「Days」で曜日を設定します。ここでは全曜日をチェックします。
  • 「Action」で「Launch an app」(アプリの起動)を選択します。
  • 「Select app」で「Screen Off and Lock」を選択します。
  • 「SAVE」ボタンをタップしてタスクを保存します。
  • タスクのチェックして有効にしておきます。

図


以上で、毎日17:00に画面がオフします。ただし、17:00ピッタリに画面オフするわけではなく、1分以内にオフするようなかんじです。

2017/07/17(Mon)

VSCodeでMarkdownからHTMLを生成

Wordでドキュメント書くのクソかったるいし、もうMarkdownでええやろと思いつつ、客に読めないと言われたら面倒だからVSCodeの拡張機能でHTMLに変換してみたら見た目が気に入らなくてスタイルシートいじりだして、だんだん何やってるのか分からなくなってきた。

VSCodeのインストール

ここからダウンロードしてインストール。

VSCodeはテキストエディタだが、Ctrl+Shift+VでMarkdownのプレビューができる。

拡張機能 Auto-Open Markdown Preview

VSCodeの画面左端にある拡張機能アイコン(四角いアイコン)をクリックして、検索テキストボックスに

「auto open markdown」と入力し、Auto-Open Markdown Previewの「インストール」をクリック。インストール後、「再度読み込む」をクリックしてAuto-Open Markdown Previewをアクティブにする。

これにより、MarkdownファイルをVSCodeで開くと、自動的に2ペインでプレビューが表示される。

拡張機能 Markdown PDF

VSCodeの画面左端にある拡張機能アイコン(四角いアイコン)をクリックして、検索テキストボックスに

「markdown pdf」と入力し、Markdown PDFの「インストール」をクリック。インストール後、「再度読み込む」をクリックしてMarkdown PDFをアクティブにする。

HTML生成

「ファイル」>「基本設定」>「設定」で、ユーザー設定に下記を追記。

// 自動セーブ
"markdown-pdf.convertOnSave": true,
// 出力フォーマット
"markdown-pdf.type": "html"

これで、Markdownファイルをセーブするときに、同フォルダにHTMLファイルが生成される。

また、Ctrl+Shift+Pでコマンドパレットを開き、 >convert m ぐらいまで入力すると「Convert Markdown to PDF」が表示されるので、これを選択してもHTMLファイルが生成できる。

スタイル

プレビューおよびHTML出力のスタイルをカスタマイズしたい場合、

「ファイル」>「基本設定」>「設定」で、ユーザー設定に下記を追記。

(ここではプレビューとHTMLに同じスタイルを適用

// プレビューのスタイル
"markdown.styles": [
  "C:/Users/(ユーザー名)/.vscode/md_preview.css"
],
// HTML出力のスタイル
"markdown-pdf.styles": [
  "C:/Users/(ユーザー名)/.vscode/md_preview.css"
]

そして、上記パスにCSSファイルを置き、ここでスタイルを定義する。デフォルトのスタイルに上書きされる。

一例を示す。

@charset "UTF-8";
body {
  margin: auto;
  width: 50em;
}
h1 {
  color: #00979D;
}
h2 {
  color: #00979D;
  border-left: 9px solid #00979D;
  border-bottom: 1px solid #00979D;
  padding: 2px 0 2px 0.5em;
}
h3 {
  color: #EC9122;
}
a:link {
  color: #00979D;
}
a:visited {
  color: #00979D;
}
a:hover {
  color: #00979D;
}

プレビューとHTML出力の例

図

  

図