自作CNC3号機の製作記録です。2017年構想、少しずつ部品を集め、完成は2019年です。いっぺんに書ければよいのですが少しずつでも公開していきます。
久々のCNC製作記事です。今回は手作りのジャバラカバーと、2年後の状態です。
ジャバラカバーはオーダーメードで高価
一般にはジャバラカバーはオーダーメードで、耐油ゴム引き布など使われています。厚みは結構重要で、ジャバラを畳むと重なり部がかなり厚みがでるので、スペースがとれない卓上CNCでは重要です。 続きを読む…
自作CNC3号機の製作記録です。2017年構想、少しずつ部品を集め、完成は2019年です。いっぺんに書ければよいのですが少しずつでも公開していきます。
久々のCNC製作記事です。今回は手作りのジャバラカバーと、2年後の状態です。
一般にはジャバラカバーはオーダーメードで、耐油ゴム引き布など使われています。厚みは結構重要で、ジャバラを畳むと重なり部がかなり厚みがでるので、スペースがとれない卓上CNCでは重要です。 続きを読む…
Windows10の大型アップデート「バージョン20H2」が私を悩ませている。以前はアップデート種類を選べたはずだが、最近は有無を言わせずアップデートされてしまう。それはまあ我慢できるが、今回はそうはいかない。
その後、4/29あたりでVMwareはV16にして、ひとまず快適に動いています。ので、内容は20H2の処々の出来事に移行しています。
2021/03/02その後を追記しました
2021/03/21その後を追記しました
2021/04/27その後を追記しました
2021/04/29その後を追記しました(おそらく完結)
2021/05/09その後を追記しました(もはやVMwareではなくOnedrive消失問題と化す)
2021/05/21その後を追記しました(20H2だけの問題)
「dsPIC(XC16)でFreeRTOS。xprintfを導入しfloatを扱う」の続編です。小規模システムでのRTOS実装です。H8/3664のころからキャラクタLCDの表示だけでもRTOSは有効です(当時はHOS)と、言っていましたが、同じ16ビットMCUのdsPICでRTOSの主要機能を実装してみました。
XC16はC言語onlyでC++が使えないので、クラス記述を使ったリエントラントな関数を作りづらいです。動的メモリ確保も手間がかかりますので、関数の実行終了までタスクをウエイトするのが一番簡単です。
今回のシステムは各タスク実行に余裕ある(5%以下)ので、この方法で問題ないです。
簡易ブロック図です。大袈裟な図だなあ、と言わずご覧ください。
永らく愛用していたVisio2003がwindows10では微妙な立ち位置なので、「代わりに!」と購入した「EdrawMax」で描いてます。Visioファイルとの互換性はなかなか厳しいものはありますが、描画簡単で超楽しいです。
シングルタスクで思いつくまま作り上げていくことに慣れた身には、RTOSは頭の中で簡単に構成できません。あらかじめ設計しておかないと苦戦します。手元のメモで設計し、何度も書き直して関連性を構築します。今回もそのメモをカッコつけて「EdrawMax」で清書です。
普段はメモで終わるのでこんなことまではやりません(^^)・・・
必要な関数を抽出してみると、気を付けないといけないのは、リエントラントでない関数を複数タスクから呼ぶ場合と、ハードウエアに対応しているeepromの変数がクリティカルセクションのリスクがありそう、ぐらいでしょうか。
まずは、main()でRTOS機能を実装します
void main() {
{変数の初期化を記述する}
extern void xPortPendSVHandler( void );
extern void xPortSysTickHandler( void );
extern void vPortSVCHandler( void );
// 排他セマフォ生成
xxprMutex = xSemaphoreCreateMutex();
xeepMutex = xSemaphoreCreateMutex();
// タスク生成
xTaskCreate(vTask1,"task_main",1000,NULL,1,&xTask1);
xTaskCreate(vTask2,"task_setting",200,NULL,1,&xTask2);
xTaskCreate(vTask3,"task_buzzer",100,NULL,3,&xTask3);
xTaskCreate(vTaskDisp,"task_display1",200,NULL,1,&xTaskDisp);
// キューバッファ生成
dispQueue = xQueueCreate(15,sizeof(Qdata)); // Byte x 15
// イベントグループ(イベントフラグ)生成
eventFlag = xEventGroupCreate();
//スケジューラを起動
vTaskStartScheduler();
for(;;);
}
便利な関数「vTaskDelayUntil()」。
システム時間が1ms単位なので、タスク内でベアメタル時間計測してもどうしてもジッタがでます。便利な関数「vTaskDelayUnti()」がありました。
計数開始に初期計測をすればあとはセットタイム自動更新するので1ms分解能で正確な周期をジッタなく刻むことができました。便利な関数ではありますがRTOS黎明期にはみなさん悩んでいたことが想像できます。
// 周期ディレイ(開始のスタートタイムのセットが不要)
vTaskDelayUntil( &xLastWakeTime, 50 ); // 50ms
RTOS用に作成する構造体は、Queue用とEEPROM用です。
まず、Queueデータ用バッファ。各所で使うのでtypedef宣言。
typedef union { // Queue用のデータフォーマット
struct {
int dot; // 小数点位置
int data; // data
int mode; // 0:数値、1:キャラクタ
char mess[8];
float fval;
};
char bt[sizeof(int)*3+8+sizeof(float)]; // 文字列
} Qdata;
Mutexで排他制御するEEPROMのデータバッファ
// EEPROM保存用変数
#define EEPSIZE sizeof(int)*12
union {
struct {
int Kpu;
int Tiu;
int Tdu;
int Kpd;
int Tid;
int Tdd;
int Sv;
int Md;
int Alp;
int Bta;
int Gma;
int dmy;
};
unsigned char ech[EEPSIZE];
} eepbuf;
EEPROM変数については、実は当初は全部float(4byte)変数にしていたので、16bitMCUではクリティカルセクションになりかねないのでMutexを採用しました。今はすべての変数をintにしたので、アセンブラを見てもクリティカルにはならないと判断していますが、システム実行にかなり余裕があるのでこのままにします。
CHaN氏作xsprintfは今更説明の必要はなく組み込みに欠かせない出力ルーチンですが、リエントラントではありませんので、排他制御でTask間の干渉を回避します。
今回使うのはメインタスクと設定タスクだけですが(デバッグ時、例えばEEPROMマーチングテストなど、では各所で使う)、Mutexをおまじないのように前後にTakeとGiveを付加するだけです。
xSemaphoreTake(xxprMutex, portMAX_DELAY); // Mutex取得
if(dot==0) {
xsprintf(ldtmp,"%4d ",dt); // for Mode
} else if(dot==1) {
xsprintf(ldtmp,"%5.1f` ",dt/10.0f); // for Sv
} else if(dot==2) {
xsprintf(ldtmp,"%5.2f ",dt/100.0f); // other param
} else xsprintf(ldtmp,"%5.3f ",dt/1000.0f);
xSemaphoreGive(xxprMutex); // Mutex解放
通常の演算関数FuncXX()は内部変数をリセットしたい場面があります。タスク間でおこなうのは面倒なのでフラグを立てて場合分けて内部リセットすることにしました。
次の項のイベントフラグと使うことにします。
itronでいうところの「イベントフラグ」は、FreeRTOSでは「event group」として使います。
個々のビットはMutexで構成され、and/orの組み合わせてビット待ちができますが、下記のように単純なandでマスクすることで単なる1ビットフラグとしても使えます。
ビット幅は、「FreeRTOSconfig.h」の「#define configUSE_16_BIT_TICKS 0」で24か8の使い分けできますが、もともと8ビットで使っている分にはどちらも問題なく使えます
// フラグをセットする
xEventGroupSetBits(eventFlag,0x02); // フラグセット
// フラグチェックし、有効なら実行してフラグクリアする
if((ret=xEventGroupGetBits(eventFlag) & 0x02)==0x02) {
// ビット1有効なら実行するルーチンを入れる
xEventGroupClearBits(eventFlag,0x02); // フラグリセット
}
ベアメタルで慣れた私にとって、キューはすごく楽しいです。だって、データが存在したときだけ稼働するのは、メモをパラパラっと書いて「印刷よろしくね!」というだけで良いのと同じですから。
渡すのが構造体なので、一般的な範囲を間違えなければ割と安全に使用できます。
// Queueを送る側の例
Qdata ldqdata;
ldqdata.dot=param[mode].dot; ldqdata.data=*param[mode].it; ldqdata.mode=mode; // Qdataに値をセット
xQueueSendToBack(dispQueue, &ldqdata, portMAX_DELAY);
// Queueを受ける側(例:キューデータ待ちでdisplay()を呼び出す)
void vTaskDisp() {
Qdata queuedata;
for(;;) {
xQueueReceive(dispQueue, &queuedata, portMAX_DELAY); // Queue待ち
display(queuedata.mode,queuedata.data,queuedata.dot,queuedata.mess);
}
}
Queueのデータをどう使うかはユーザ次第です。はじめは余分にマージン取っておいて最後に調整するのが良いです。dsPIC33CK256はメモリに比較的余裕あるので、文字列エリアを多めに確保するなどして確認しておきます。当然ですが例えば4文字は’\0’が入るので5文字分確保が必須です。
1ms分解能のリアルタイム性に「vTaskDelayUnti」が使えるのがわかった時点で、16ビットMCUでもRTOSを使おう、という意識がどんどんわいてきました。
FreeRTOSの情報は、まだ十分とはいえません。どんどん使って、どんどんアップしましょ。
このところサイトヘルスステータスにて、「PHP(推奨7.4)にバージョンアップしなさい」と出てくる。現在7.2で、過去に7.3にしたらエラーメッセージでサイト表示しない事例に遭ったので、特に調査も対策もせず放っておいたものでした。
とりあえず、バックアップして、PHPを7.4にしてみた。すると・・・
そこで、ググってみると、ソース表示プラグイン「CrayonSyntaxHighlighter」が原因であることが判明。「preg_replace()関数」がPHP7.3以降に対応していないらしい。
このプラグイン、長期間メンテナンス行われておらず、この際代替おすすめの「SyntaxHighlighter Evolved」にすることにしました。プラグインの移行は簡単に終了!。
そして、PHP7.4.13にVUP。サイトは無事に表示デター!
ソースを記述する際、「Crayon・・・」はブロック内埋め込み型、「SyntaxHighlighter Evolved」はブロック単体型です。過去のソースはすべて、プレーンテキストになってしまい、体裁が落ちています。ソースを埋め込んだ記事のすべてを、コピペでブロックとして書き直さなければならないのは手間がかかりますが。tagが増えすぎて整理したいので丁度良い機会かもしれません。
これから徐々に進めていこうとおもいます。
なにげに通っていた道に、カタクリが群生しているのを発見!。春も佳境に入り小山田のこの季節の林下では割と普通(ちょっと誇張してます)にイチリンソウやヤマルリソウが見られますが、わたしにとってはカタクリは初めてです。
北斜面にネットで囲われ栽培種のニオイもしなくはないですが、近隣の忠生地区にある「かたかごの森」のものとほぼ同じように見れます。
我が地区はどこ行くにも坂道の多い小山田ですが、仕事の合間にちょっと癒されます。
すこし離れた場所なので写真はなかなか苦しいですが、フルサイズで貼り付けます
VS2019 C#でWindowsフォームアプリ作成で、数値専用TextBoxの覚書です。Webでは皆さんいろいろ試されているようです。それらのツマミ喰いで自分なりに実装してみました。 続きを読む…
dsPIC33CK256MP505では、2個のDedicated(専用)ADCと1個のShared(共用)ADCがあり、どちらもオーバーサンプリングフィルタを設定できます。今回初めて使ってみました。
いつもDedicatedADCは主にPWMトリガで電流検出に使うため、サンプルタイミングがクリティカルなのでオーバーサンプリングをしたことがありません。今回はADC1を1ms周期の普通のアナログ入力にしたので、適用してみました。
応用に使ったボードは20KHzPWMで強烈なスイッチングをしているのでセンサ入力など中・低速サンプリングには結構なノイズが乗ってきます。
メーラーといえば十数年「EdMaxフリー版」を使っていました。テキスト形式で使う分にはシンプルで使いやすく、インストール不要でフォルダごとバックアップができる利便性が心地よいメーラーでした。
ただ、2008/07/11でサポート・更新が終了し、ブラウザの連携やHTMLメールの扱いにやや難があるので、引っ越すことにしました。
※2021/03/05追記 その後のいろいろあり一筋縄ではではいきません。顛末は「メーラー引っ越しその後」で継続しています。
dsPIC33CKでFreeRTOSを使うの続編です。RTOSでsprintfを使いたいですが、標準入出力のprintf/scanfは共通ヒープメモリを使うのでRTOSではうまくない、とのことです。実際sprintfではうまくなかったです。そこでCHaN氏作「xprintf」の登場です。
「xprintf」はすでにPSoC5LPでFreeRTOSでも使っています。使いたい関数は、文字列に対する「xsprintf」で、今回はfloatを扱ってみます。
なお、試していませんが、一文字出力ルーチンに出力のポインタを指定すれば、LCDやUARTに直接出力することもできるらしいです。う~ん、これは凄い!
環境はMPLAB Xv5.45 XC16 v1.6です
EdMaxからThunderbirdへ移行記事「さらばEdMax・・・メーラー引っ越し」のその後の続編です。Thinderbirdは使いながら覚えればいい・・と簡単に考えていましたが、なかなかどうして奥が深い。