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

f:id:yuppi5:20210220173704j:plain

前回 : Teensy 4.1メモ1 - 開発環境を整える

前回はサンプルをそのまま使って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_BITMASK13 はそのためです。

GPIO7_DR の使用

特定のピンだけ値を変えたい場合には、参考サイトのように CORE_PIN13_PORTSETCORE_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 と公式でラップされているので、実用上マスクの番号を知る必要はなさそうです。

参考サイトさん

ehbtj.com


前回 : Teensy 4.1メモ1 - 開発環境を整える

次回 :

Teensy 4.1メモ1 - 開発環境を整える

今回は、Teensy 4.1を開発するための環境を整えます。

ソフトのダウンロード

この2つをダウンロードします。

f:id:yuppi5:20210213025813p:plain
TeensyDuinoのダウンロードページのスクリーンショット

ただし、TeensyDuinoが載せられるArduino IDEのバージョンには注意してください。上のスクリーンショットでは1.8.13と書いてあるので、それを超えたバージョンのArduino IDEはダウンロードできないことになります。

もしここに載っていないバージョンがArduino IDEのページに載っていたら、「Previous Releases」のところに過去のバージョンのリンクがあるので、そこからダウンロードしましょう。

Arduino IDEのダウンロードは下のスクリーンショットで示すように「Windows ZIP file」から行えます。

f:id:yuppi5:20210213030119p:plain
Arduino IDEのダウンロードページのスクリーンショット

ちなみに私の環境ではTeensyDuinoのほうがダウンロードに時間が掛かったので、先にダウンロードするのをおすすめします。

ソフトのインストール

順番はよくわからないのですが、とりあえずArduino IDEの方から先にインストールしました。無難だと思います。

Hello World

とりあえずLチカさせたいときは、ファイルスケッチ例FlexiTimer2FlashLed を選択すると良いです。

f:id:yuppi5:20210213031241p:plain
Arduino IDEスクリーンショット

スケッチ例までの階層は上のスクリーンショットのようになっています。 たくさんサンプルがあって入り組んでますね。

サンプルを開いたら、検証→(コンパイル終了)→Teensyのボタンを押す の流れでプログラムを書き込めると思います。出てきたダイアログの指示に従ってください。


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

1文の文字数を列挙するスクリプト

説明

タイトルの通り、1文の文字数を列挙するスクリプトです。改行を削除し、文章の終わり ("。" or "?" or "?" or "!" or "!") で分割しそれぞれの文字数を測ります。

f:id:yuppi5:20201225171247p:plain

Excelにコピペして箱ひげ図を書くと他と比較しやすくなります。

基本的に、読みにくいと思った文章は1文の長さが平均90文字になるなど、長い傾向にあります。そうしたことを調べる手段としてこのスクリプトを使うと良いんじゃないかなと思います。

おまけとして中央値・最大値などの値を出力する機能をつけてあります。 なお、第1四分位点と第3四分位点の定義は様々あったため、計算していません。

スクリプト

入力


出力

最小値 中央値 最大値 平均値

その他サイト

文の長さを計測して度数分布を表示するWebサービス - 文長さ計測[αテスト中]

こちらのサイトであれば、度数分布が見られます。

VALUESTAR VW770/BでWindows10 1909へのアップデートに失敗するときの解決策

VALUESTARのVW770/BでWindows10のバージョン1809から1909にアップデートしようとしました。しかし、2度アップデートを試みるも失敗。解決策を探していました。

解決策はありました。こちらのサイトです。

pcdoc-support.com

こちらではVW770/Cですが、VW770/Bにも適用できました。今は無事アップデートでき、バージョン1909のWindows 10が動いています。

さて、解決策はサイトに載っている通りです。デバイスマネージャから記憶域コントローラーを開き、2つあるO2Microの両方をアンインストールします。このときダイアログが出るので「このデバイスのドライバー ソフトウェアを削除します。」にチェックを入れてからアンインストールをしてください。両方アンインストールが終わったら、アップデートができます。

バイスのアンインストールに関しては、スクリーンショットが載っているこちらのサイトが参考になりました。

www.pinequick.com

こちらでは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プレビュー機能をご利用ください)

機能

f:id:yuppi5:20200717232909p:plain

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

f:id:yuppi5:20200717234006p:plainf:id:yuppi5:20200717233819p:plain

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

f:id:yuppi5:20200717233954p:plain

数式のところはVSCodeLaTeX拡張と同じ緑色に変えました。

経緯

作った経緯は、既存のVSCode拡張機能Re:VIEW Starterで満足に使えなかったからです。新しい命令、命令の入れ子……。そのあたり全てに対応する拡張機能が欲しいと思いました。

そこで、まずはすでにある拡張機能*1を改造する方針を取りました。 しかし、私にとって改造は難易度が高く、この方針は早くも変えられることになります。

次に取った方針は、1から自分で作る方針でした。 1から自分で作るにあたり、思い切ってプレビュー機能を諦めることにしました。というのも、Re:VIEW StarterにはHTMLプレビュー機能があるためです。製作者直轄の機能なので、バグ修正や機能追加がすぐに反映されます。よって不要だと判断しました。まあ、プレビュー機能の実装ができそうになかったのもありますが……。

プレビュー機能を諦めたので、残ったのはシンタックスハイライト、コード補完、文法ミスの指摘ぐらいです。まず必要だと思って実装したのはシンタックスハイライトでした。拡張機能の名前にもあるように、元々はシンタックスハイライトのみにする予定でした。

シンタックスハイライトの部分は構文定義で正規表現を駆使してなんとかしました。やってるときはパズルみたいで楽しいんですが、後から見返すと可読性が最悪になってました。呪文だろこれ。おそらく半年後には読めなくなっているはずです。

f:id:yuppi5:20200718131924p:plain
呪文

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

f:id:yuppi5:20200718132024p:plain
入れ子の定義

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

f:id:yuppi5:20200718132146p:plain
コード補完のワードを列挙

動作確認は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インバーターを作ったので、それの紹介をします。

あらすじ

1年前、プリント基板で3レベルインバーターを作りました。しかし、直流電圧を140V以上(半分以上)にすると謎の素子破壊を起こし、実用には程遠い状況でした。

今回は、ユニバーサル基板で作り直しました。通常の電圧でも素子が壊れないものを作れたので、紹介します。

作る過程

某流行り病の影響もあって、部品を買い足すことなく3レベルインバーターを作ろうと試みました。「おウチにあるもので電子工作しようキャンペーン」ですね。そんなものはありません。

まあキャンペーンは冗談だとして、4・5月は外出できなかったのでそうすることにしました。 部品は過去に作っていた基板から部品取りをするなど、なんとか捻出しました。3レベルインバーター、バカみたいに部品を消費していきますね。たくさんあったはずの0.1μFの積セラの在庫がなくなりました。

完成品

f:id:yuppi5:20210220173110j:plain
全体図

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

f:id:yuppi5:20210220173147j:plain
スイッチング素子が載った基板を横から見る

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

f:id:yuppi5:20210220173211j:plain

放熱は適当なアルミ片をターンクリップでくっつけてしのいでいます。穴を空けるのが面倒だった(横着)

本当は下層の基板の高さも上層と同じ20mmにする予定でしたが、クリップが厚くて縮められませんでした。家にあるもので作ったから仕方ないね。

問題点の解決

1年前に作ったときは問題点が4つありました。今はどのくらい解決されているでしょうか?

  • 回路がガバ → 解決!
  • 電源が弱い → 解決!
  • 直流電圧半減による音量の小ささ → 解決!
  • なぜか発熱するFET → 未解決

3つは解決しましたが、発熱の問題は残りました。3周ぐらい遊ぶとヒートシンク(?)が温まります。 ただ、前回と違って無負荷でゲート信号を入れても発熱しないので、大きな進歩です。

おわりに

3レベルインバーターを作れてよかったです。動画をたくさん投稿していきたいです。

f:id:yuppi5:20200624225606j:plain
Twitterの動画のスクリーンショット

USBスピーカー・マイクの箱を作る

オンライン会議などが増えて、マイクを使う機会も増えてきました。私はパソコンに付いているマイクを使っていましたが、音質が悪いため別のマイクに替えたいと思っていました。そこで、過去に使っていたUSBヘッドセットの中身を取り出して、使いやすいUSBスピーカー・マイクを作ることにしました。

USBヘッドセットの中に入っていた基板がこれです。

f:id:yuppi5:20210220172233j:plain

配線がごちゃごちゃして汚いのは、USB端子の接触不良のためUSB機能を殺してふつうのヘッドフォンに改造して使っていたからです。このヘッドフォンの音質はそこそこ良いので、改造してでも使い続けています。

さて、この基板にはステレオ出力・マイク入力があります。これらを全て使い、加えて何か機能を付けます。ここでは、マイクのON/OFFスイッチを付けることにしました。マイクを箱に内蔵することも考えましたが、箱にたくさん機能をつけるスペースはないので、スイッチのみを追加機能としました。マイクを電気的にOFFにできると安心なので、こちらを優先しました。

必要な機能をまとめます。

  • USB端子
  • ステレオ出力
  • モノラル入力 (マイク用)
  • マイクスイッチ

機能が決まったので、あとは端子のハンダ付けと箱の加工です。

f:id:yuppi5:20210220172255j:plain

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

f:id:yuppi5:20210220172316j:plain

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

完成写真がこちら。

f:id:yuppi5:20210220172331j:plain

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