3Dプリンタ用保温ボックスを作って、ABSでの出力がうまく行くようになったのはいいのですが、ボックス内がかなり高温になっている(あたりまえですが・・・)のが気になります。
実際どのくらいなのか、手持ちの部品で温度を測ってみることにしました。
PCへの取り込みはシリアルで、秋月で以前購入したFTDI USBシリアル変換ケーブル(5V)を使いました。マイコンはPIC12F1822、温度センサーはLM35DZを使っています。最初はESP8266かESP32でAmbientに直接送信させようかとも思ったのですが、今回は測定気温が80℃を超えているかもしれませんし、場合によっては100℃を超えているかもしれません。なので、自己発熱が少なく(=消費電力を抑えることができる)壊れてもすぐ交換可能なPICとデータシート上150℃まで動作可能なLM35を使用することにしました。
ソフトはMPLAB Code Configuratorで以下のように設定しました。
- CPUの動作周波数は初期設定の内部クロック500kHz
- RA4/RA5にEUSARTを割付け、通信パラメータは初期設定の9600bpsのままで、Enable EUSART Interrupts で割り込みを許可。送受信バッファは各16バイト(受信は機能として使ってませんが)
- TMR1はプリスケーラを1:2に設定変更して、Timer Periodを1秒に設定、Enable Timer Interrupt でタイマ割り込みを発生させます。
- FVRで1.024VのADC用の基準電圧を発生させます。
- ADCはPositive ReferenceをFVRにして、基準電圧を1.024Vにします。これで10bit分解能なので、入力電圧換算で10mVの分解能となります。LM35DZは100mV/1℃なので、0.1℃単位でAD変換できることになります。Result Alignmentはrightに変更して、読んだ値を1/10すれば温度直読になるようにします。
- ピンマネージャでADCはAN2を設定、EUSARTはRX/TXをRA5/RA4に割り付けます。
これでMPLAB Code Configuratorにソースを吐かせて、main.cを作成しました。
#include "mcc_generated_files/mcc.h" #include <stdlib.h> bool exec=false; unsigned long int time=0; void TMR1int(void){ exec = true; time++; } /* Main application */ inline void EUSART_putchar(unsigned char ch){ EUSART_Write(ch); } void EUSART_puts(char *str){ uint16_t p=0; while(str[p]!=0) EUSART_putchar(str[p++]); // Write data } void EUSART_putdec(unsigned long int num){ char buf[10]; unsigned long int t,u; int8_t i=0; while(1){ buf[i]=(num % 10)+'0'; num = num / 10; if(num == 0)break; i++; } while(i>=0){ EUSART_putchar(buf[i]); i--; } } void EUSART_putLM35(unsigned long int num){ char buf[10]; unsigned long int t,u; int8_t i=0; while(1){ buf[i]=(num % 10)+'0'; num = num / 10; if(num == 0)break; i++; } while(i>=0){ if(i==0) EUSART_putchar('.'); EUSART_putchar(buf[i]); i--; } } void main(void) { // initialize the device SYSTEM_Initialize(); // EUSART_Initialize(); TMR1_SetInterruptHandler(TMR1int); exec = false; time=0; // Enable the Global Interrupts INTERRUPT_GlobalInterruptEnable(); // Enable the Peripheral Interrupts INTERRUPT_PeripheralInterruptEnable(); while (1) { if(exec){ // Read LM35DZ uint16_t convertedValue; ADC_Initialize(); convertedValue = ADC_GetConversion(channel_AN2); // Send to HOST EUSART_putdec(time); EUSART_putchar(' '); EUSART_putLM35((unsigned long int)convertedValue); EUSART_putchar(0x0d); EUSART_putchar(0x0a); exec = false; } // Add your application code } }
ビルドして、PICkit3で書き込みます。書き込む際はICクリップを使うことで、基板上の書き込みに関する信号の配線作業を省略しています。DIPパッケージで20ピンまでの8bitのPICは電源/GNDを含めて1ピン側の8ピンに書き込みに必要な信号が共通で出ています。ですので、この8ピンのICクリップは20ピンまでの8ビットのPICで共通に使用することができます。(例外はあるかもしれませんが・・・)
実行すると1秒単位に電源投入からの経過秒数と温度を出力します。
: : 898 29.7 899 29.8 900 29.6 901 29.7 902 29.6 903 29.7 904 29.6 905 29.8 906 29.7
測定したら、そのテキストファイルをLibre Officeに読み込ませてグラフ化させるつもりです。