Teensy 4.1メモ2 - ベアメタルでLチカとピン機能対応表

前回はサンプルをそのまま使ってLチカをしました。 今回はベアメタルでLチカをします。 また、ベアメタルで必須であるポート番号がわかるピン機能対応表も載せています。
ベアメタルでLチカするプログラム
int cnt = 0; void setup(void){ pinMode(LED_BUILTIN, OUTPUT); } void loop(void){ if (cnt & 1) { GPIO7_DR = CORE_PIN13_BITMASK; } else { GPIO7_DR = 0; } cnt++; delay(250); }
ベアメタルでLチカするプログラムは上のようになっています。 ボードについている LED を0.5秒周期で点滅させるプログラムです。 コピペして書き込めば動きます。
プログラムの特徴
ピン番号について
LEDがついているピン番号は13番です。
CORE_PIN13_BITMASK の 13 はそのためです。
GPIO7_DR の使用
特定のピンだけ値を変えたい場合には、参考サイトのように CORE_PIN13_PORTSET と CORE_PIN13_PORTCLEAR を使うと便利です。
しかし、いくつかのピンの値を一括で変更したい場合は不便です。
そこで、GPIO7_DR を使うと、ピンの値を一括で変更できて便利になります。
AVRやSTM32などといった標準的なマイコンではお馴染みの方法ですね。
日本語で GPIO7_DR を解説しているサイトはなかったので、この記事を書きました。
なぜ 7 なのかや、どのピンがどんな数字なのかについてはピン機能対応表にて後述します。
pinMode の併用
pinMode の中身を覗いた感じ、GPIOの設定までベアメタルでやるのは難しそうだったので併用しました。
(ほぼ自分用メモ) この13番ピンに限っては、GPIO7_GDIR とか、IOMUXC_SW_MUX_CTL_PAD_GPIO_B0_03 とかが出てきました。後者に関してはピンごとに名前がかなり変わっていたので追うのをやめました。
(ARDUINOのフォルダー)/hardware/teensy/avr/cores/teensy4 の中に根幹となるライブラリーが入っているようです。この中身を全文検索すると pinMode の中身やピン番号、GPIOのポート番号がわかったりします。
ピン機能対応表
ピン機能対応表です。
公式サイトと(ARDUINOのフォルダー)/hardware/teensy/avr/cores/teensy4/core_pins.h を照らし合わせて作りました。7・8列目が何を示しているのかは未調査です…。各自で適当に補完してください。
| ピン番号 | ポート | マスク | AD | UART | SPI | ? | ? | PWM | I2C | SDIO | RAM |
|---|---|---|---|---|---|---|---|---|---|---|---|
| P0 | 6 | 3 | RX1 | CS1 | CRX2 | PWM | |||||
| P1 | 6 | 2 | TX1 | MISO1 | CTX2 | PWM | |||||
| P2 | 9 | 4 | OUT2 | PWM | |||||||
| P3 | 9 | 5 | LRCLK2 | PWM | |||||||
| P4 | 9 | 6 | BCLK2 | PWM | |||||||
| P5 | 9 | 8 | IN2 | PWM | |||||||
| P6 | 7 | 10 | OUT1D | PWM | |||||||
| P7 | 7 | 17 | RX2 | OUT1A | PWM | ||||||
| P8 | 7 | 16 | TX2 | IN1 | PWM | ||||||
| P9 | 7 | 11 | OUT1C | PWM | |||||||
| P10 | 7 | 0 | CS | MQSR | PWM | ||||||
| P11 | 7 | 2 | MOSI | CTX1 | PWM | ||||||
| P12 | 7 | 1 | MISO | MQSL | PWM | ||||||
| P13 | 7 | 3 | SCK | PWM | |||||||
| P14 | 6 | 18 | A0 | TX3 | S/PDIF OUT | PWM | |||||
| P15 | 6 | 19 | A1 | RX3 | S/PDIF IN | PWM | |||||
| P16 | 6 | 23 | A2 | RX4 | SCL1 | ||||||
| P17 | 6 | 22 | A3 | TX4 | SDA1 | ||||||
| P18 | 6 | 17 | A4 | PWM | SDA | ||||||
| P19 | 6 | 16 | A5 | PWM | SCL | ||||||
| P20 | 6 | 26 | A6 | TX5 | LRCLK1 | ||||||
| P21 | 6 | 27 | A7 | RX5 | BCLK1 | ||||||
| P22 | 6 | 24 | A8 | CTX1 | PWM | ||||||
| P23 | 6 | 25 | A9 | CRX1 | MCLK1 | PWM | |||||
| P24 | 6 | 12 | A10 | TX6 | PWM | ||||||
| P25 | 6 | 13 | A11 | RX6 | PWM | ||||||
| P26 | 6 | 30 | A12 | MOSI1 | |||||||
| P27 | 6 | 31 | A13 | SCK1 | |||||||
| P28 | 8 | 18 | RX7 | PWM | |||||||
| P29 | 9 | 31 | TX7 | PWM | |||||||
| P30 | 8 | 23 | CRX3 | ||||||||
| P31 | 8 | 22 | CTX3 | ||||||||
| P32 | 7 | 12 | OUT1B | ||||||||
| P33 | 9 | 7 | MCLK2 | PWM | |||||||
| P34 | 7 | 29 | RX8 | ||||||||
| P35 | 7 | 28 | TX8 | ||||||||
| P36 | 7 | 18 | CS | PWM | |||||||
| P37 | 7 | 19 | CS | PWM | |||||||
| P38 | 6 | 28 | A14 | CS1 | IN1 | ||||||
| P39 | 6 | 29 | A15 | MISO1 | OUT1A | ||||||
| P40 | 6 | 20 | A16 | ||||||||
| P41 | 6 | 21 | A17 | ||||||||
| P42 | 8 | 15 | MISO2 | PWM | DAT1 | ||||||
| P43 | 8 | 14 | MOSI2 | PWM | DAT0 | ||||||
| P44 | 8 | 13 | CS2 | PWM | SDA1 | CLK | |||||
| P45 | 8 | 12 | SCK2 | PWM | SCL1 | CMD | |||||
| P46 | 8 | 17 | RX5 | PWM | DAT3 | ||||||
| P47 | 8 | 16 | TX5 | PWM | DAT2 | ||||||
| P48 | 9 | 24 | RX8 | CS0 | |||||||
| P49 | 9 | 27 | SCK2 | D1 | |||||||
| P50 | 9 | 28 | MOSI2 | D2 | |||||||
| P51 | 9 | 22 | PWM | SCL1 | CS1 | ||||||
| P52 | 9 | 26 | RX1 | D0 | |||||||
| P53 | 9 | 25 | TX1 | PWM | CLK | ||||||
| P54 | 9 | 29 | MISO2 | D3 |
例えば、LEDがくっついている13番ピンについて見ていきます。
このピンのポート番号は7なので、GPIO7_DR を使うことがわかります。
マスクは GPIOx_DR の何ビット目にそのピンが対応しているのかを示しています。ただ、CORE_PIN13_BITMASK と公式でラップされているので、実用上マスクの番号を知る必要はなさそうです。
参考サイトさん
Teensy 4.1メモ1 - 開発環境を整える
今回は、Teensy 4.1を開発するための環境を整えます。
ソフトのダウンロード
この2つをダウンロードします。

ただし、TeensyDuinoが載せられるArduino IDEのバージョンには注意してください。上のスクリーンショットでは1.8.13と書いてあるので、それを超えたバージョンのArduino IDEはダウンロードできないことになります。
もしここに載っていないバージョンがArduino IDEのページに載っていたら、「Previous Releases」のところに過去のバージョンのリンクがあるので、そこからダウンロードしましょう。
Arduino IDEのダウンロードは下のスクリーンショットで示すように「Windows ZIP file」から行えます。

ちなみに私の環境ではTeensyDuinoのほうがダウンロードに時間が掛かったので、先にダウンロードするのをおすすめします。
ソフトのインストール
順番はよくわからないのですが、とりあえずArduino IDEの方から先にインストールしました。無難だと思います。
Hello World
とりあえずLチカさせたいときは、ファイル > スケッチ例 > FlexiTimer2 > FlashLed を選択すると良いです。
スケッチ例までの階層は上のスクリーンショットのようになっています。 たくさんサンプルがあって入り組んでますね。
サンプルを開いたら、検証→(コンパイル終了)→Teensyのボタンを押す の流れでプログラムを書き込めると思います。出てきたダイアログの指示に従ってください。
1文の文字数を列挙するスクリプト
説明
タイトルの通り、1文の文字数を列挙するスクリプトです。改行を削除し、文章の終わり ("。" or "?" or "?" or "!" or "!") で分割しそれぞれの文字数を測ります。

Excelにコピペして箱ひげ図を書くと他と比較しやすくなります。
基本的に、読みにくいと思った文章は1文の長さが平均90文字になるなど、長い傾向にあります。そうしたことを調べる手段としてこのスクリプトを使うと良いんじゃないかなと思います。
おまけとして中央値・最大値などの値を出力する機能をつけてあります。 なお、第1四分位点と第3四分位点の定義は様々あったため、計算していません。
スクリプト
入力
出力
| 最小値 | 中央値 | 最大値 | 平均値 |
|---|---|---|---|
その他サイト
文の長さを計測して度数分布を表示するWebサービス - 文長さ計測[αテスト中]
こちらのサイトであれば、度数分布が見られます。
VALUESTAR VW770/BでWindows10 1909へのアップデートに失敗するときの解決策
VALUESTARのVW770/BでWindows10のバージョン1809から1909にアップデートしようとしました。しかし、2度アップデートを試みるも失敗。解決策を探していました。
解決策はありました。こちらのサイトです。
こちらではVW770/Cですが、VW770/Bにも適用できました。今は無事アップデートでき、バージョン1909のWindows 10が動いています。
さて、解決策はサイトに載っている通りです。デバイスマネージャから記憶域コントローラーを開き、2つあるO2Microの両方をアンインストールします。このときダイアログが出るので「このデバイスのドライバー ソフトウェアを削除します。」にチェックを入れてからアンインストールをしてください。両方アンインストールが終わったら、アップデートができます。
デバイスのアンインストールに関しては、スクリーンショットが載っているこちらのサイトが参考になりました。
こちらではSDカードの認識について解説されていますが、アンインストール手順については全く同じです。
まとめサイトのような形にはなりましたが、「VW770/B」という機種を今も使っていて困っている人がいたら、と思い記事を書きました。VW770/Bは音がデフォルトで良いので、SSD換装しつつずっと使っています。10年前のPCなのにちゃんと動いててえらい。
Re:VIEW Starter用のVSCode拡張機能を作った
Re:VIEW Starterのシンタックスハイライト・コード補完をするVisual Studio Code(VSCode)拡張機能「Re:VIEW Starter Syntax Highlight」を作りました。
インストールはこちら : Visual Studio Marketplace
ソースコードはこちら : GitHubリポジトリー
(プレビュー機能はありません。StarterにあるHTMLプレビュー機能をご利用ください)
機能

シンタックスハイライト : インライン命令・ブロック命令に色がつきます。ちなみに、画像の内容はPWM波形再現の記事をRe:VIEWの形式に変換したものです。


コード補完もついてます!べんり。

数式のところはVSCodeのLaTeX拡張と同じ緑色に変えました。
経緯
作った経緯は、既存のVSCode拡張機能がRe:VIEW Starterで満足に使えなかったからです。新しい命令、命令の入れ子……。そのあたり全てに対応する拡張機能が欲しいと思いました。
そこで、まずはすでにある拡張機能*1を改造する方針を取りました。 しかし、私にとって改造は難易度が高く、この方針は早くも変えられることになります。
次に取った方針は、1から自分で作る方針でした。 1から自分で作るにあたり、思い切ってプレビュー機能を諦めることにしました。というのも、Re:VIEW StarterにはHTMLプレビュー機能があるためです。製作者直轄の機能なので、バグ修正や機能追加がすぐに反映されます。よって不要だと判断しました。まあ、プレビュー機能の実装ができそうになかったのもありますが……。
プレビュー機能を諦めたので、残ったのはシンタックスハイライト、コード補完、文法ミスの指摘ぐらいです。まず必要だと思って実装したのはシンタックスハイライトでした。拡張機能の名前にもあるように、元々はシンタックスハイライトのみにする予定でした。
シンタックスハイライトの部分は構文定義で正規表現を駆使してなんとかしました。やってるときはパズルみたいで楽しいんですが、後から見返すと可読性が最悪になってました。呪文だろこれ。おそらく半年後には読めなくなっているはずです。

入れ子の実装は構文定義でできました。$self。
インライン命令もブロック命令も入れ子も対応してます。
一部の命令は入れ子にできないようですが、ここではインラインLaTeX命令の@<m>{}以外は全て入れ子にできるようになっています。やる気があれば、このあたりも改善する予定です。

シンタックスハイライトが思ったよりも簡単にできたので、ついでにコード補完を実装しました。現在ある命令をすべて列挙するだけだったので、これもまた簡単でした。実装して良かった。

動作確認はRe:VIEW Starterで生成される*.reファイルで一通りしました。//sampleoutputbeginあたりはユーザーズガイドに載っていませんでしたが、生成された*.reファイルにあったので一応ハイライトされるようにしています。
2日間で集中して作ってたら公開できる段階まで来たので、せっかくだし公開しようということになりました。公開は思ったよりも簡単にできました。アカウントを取ってトークンを入手するので面倒かなと思っていましたが、GitHubとの連携があったのでずいぶん楽でした。
これで拡張機能をバンバン公開していけますね。たぶんしない。
参考サイト
Re:VIEW Starter
ここから言及しないと始まらない。このために拡張機能を作りました。素晴らしいツールです。
【VS Code】HSPのSyntax Highlight Extensionを作った話 - Qiita
シンタックスハイライトの拡張機能を作る解説です。ひな形をコマンドで作成するところから解説されています。とても参考になりました。
VSCodeで俺々言語モードを作る - Qiita
VSCodeで新しい言語のための拡張機能について全般的に解説されているサイトです。とても参考になりました。
Sublime Text2 言語パッケージ作成:構文定義 - Qiita
解説はSublime Textですが、VSCodeでもそのまま使えます。構文定義でとても参考になりました。
拡張機能の公開 | 非公式 - Visual Studio Code Docs
マーケットプレイスへの拡張機能の登録について解説されています。 非公式日本語訳だそうですが、とても参考になりました。
この4つのサイトを読めば、拡張機能の作成から公開までだいたいできると思います。
リベンジ:3レベルVVVFインバーターの自作
3レベルVVVFインバーターを作ったので、それの紹介をします。
自作3レベルVVVFインバーターです
— ゆっP (@yuppii5) 2020年6月24日
ついにできました pic.twitter.com/NCuJNoM5ZN
あらすじ
1年前、プリント基板で3レベルインバーターを作りました。しかし、直流電圧を140V以上(半分以上)にすると謎の素子破壊を起こし、実用には程遠い状況でした。
今回は、ユニバーサル基板で作り直しました。通常の電圧でも素子が壊れないものを作れたので、紹介します。
作る過程
某流行り病の影響もあって、部品を買い足すことなく3レベルインバーターを作ろうと試みました。「おウチにあるもので電子工作しようキャンペーン」ですね。そんなものはありません。
まあキャンペーンは冗談だとして、4・5月は外出できなかったのでそうすることにしました。 部品は過去に作っていた基板から部品取りをするなど、なんとか捻出しました。3レベルインバーター、バカみたいに部品を消費していきますね。たくさんあったはずの0.1μFの積セラの在庫がなくなりました。
完成品

全体はこんな感じ。下から3・4層目の基板が今回作ったものです。今までは2レベル構成のスイッチング素子+ゲート駆動回路が載っていた部分で、今回3レベルに置き換わりました。

3レベルの基板は2層構造になっています。下がU・V相、上がW相とデッドタイム生成用マイコン置き場です。

放熱は適当なアルミ片をターンクリップでくっつけてしのいでいます。穴を空けるのが面倒だった(横着)
本当は下層の基板の高さも上層と同じ20mmにする予定でしたが、クリップが厚くて縮められませんでした。家にあるもので作ったから仕方ないね。
問題点の解決
1年前に作ったときは問題点が4つありました。今はどのくらい解決されているでしょうか?
- 回路がガバ → 解決!
- 電源が弱い → 解決!
- 直流電圧半減による音量の小ささ → 解決!
- なぜか発熱するFET → 未解決
3つは解決しましたが、発熱の問題は残りました。3周ぐらい遊ぶとヒートシンク(?)が温まります。 ただ、前回と違って無負荷でゲート信号を入れても発熱しないので、大きな進歩です。
おわりに
3レベルインバーターを作れてよかったです。動画をたくさん投稿していきたいです。
USBスピーカー・マイクの箱を作る
オンライン会議などが増えて、マイクを使う機会も増えてきました。私はパソコンに付いているマイクを使っていましたが、音質が悪いため別のマイクに替えたいと思っていました。そこで、過去に使っていたUSBヘッドセットの中身を取り出して、使いやすいUSBスピーカー・マイクを作ることにしました。
USBヘッドセットの中に入っていた基板がこれです。

配線がごちゃごちゃして汚いのは、USB端子の接触不良のためUSB機能を殺してふつうのヘッドフォンに改造して使っていたからです。このヘッドフォンの音質はそこそこ良いので、改造してでも使い続けています。
さて、この基板にはステレオ出力・マイク入力があります。これらを全て使い、加えて何か機能を付けます。ここでは、マイクのON/OFFスイッチを付けることにしました。マイクを箱に内蔵することも考えましたが、箱にたくさん機能をつけるスペースはないので、スイッチのみを追加機能としました。マイクを電気的にOFFにできると安心なので、こちらを優先しました。
必要な機能をまとめます。
- USB端子
- ステレオ出力
- モノラル入力 (マイク用)
- マイクスイッチ
機能が決まったので、あとは端子のハンダ付けと箱の加工です。

二クロム線を使ってUSB端子の穴を加工していますが、カッターを使ったほうがきれいだったのであまり意味がありませんでした。部屋が臭くなっただけ。

基板・端子を箱に詰めました。端子が出ている面はかなりギュウギュウです。マイクを内蔵する余裕はなかったですね。
完成写真がこちら。

箱をきれいに加工できたので満足しています。長く使えそうです。

