STM32勉強日記(2021/7/11):AD変換を行う
STM32で、AD変換1.今日やりたいこと(目標、計画) (1)AD変換の値の取得 (2)可変抵抗で、DFplayerの音量を制御する2.今日出来たこと(結果) (1)AD変換の値の取得 (2)可変抵抗で、DFplayerの音量を制御する → 出来なかった。3.内容STM32勉強日記(2021/7/11):AD変換を行う昨日の時点で、ヘッダファイルの作り方について勉強していたが、とりあえず、先にAD変換を行い、可変抵抗で、DFplayerの音量を制御出来るようにしたい。ただ、半オール開けなので、眠くなったら寝ようかな。今回作成プログラム内容(予定) ・可変ボリュームから電圧の値をAD変換によって、取得する。 ・それを0~30のボリュームで調整出来る用にする。 ・青ボタンを押すと、次の曲が再生される。AD変換のやり方は、ADCの実習があったので、それを元に、作成していく。大まかな処理:・青ボタンスイッチは、割り込み処理で監視する。・スイッチが押されたら Pushed を 0から1に変更する。・Pushedが1の時、次の曲を再生すし、Pushed=0にする処理をメイン関数内に記載。・Pushedが1以外の時、何もしない処理を記載。・可変抵抗の電圧の入力を割り込み処理で監視する。・AD変換した電圧の値をvoltage1に格納する。・voltage1の値をvoltage2に格納する。・音量ボリューム用変数 volume = voltage1 / 30で、音量に変更する。・volumeはuint型にする。 (voltage1を30分割して、整数値を返す)・ボリューム変更用変数:vol[]=xxxを作成し、コマンドの数値を入れる。・if関数で、volumeの値が変わった時、UART通信で、データコマンドを送信する。・volumeの値の変化したら実行する:if(volume1 != volume2){}で、 volume2 = volume1にする。 ・volume1が変化した時だけ、ifの中の処理が実行される。定数の設定constを使うか、defineを使うかどっちが良いのだろうか。見た感じ、どうやら定数を使う場合、defineよりconstを使う方がよさそう。理由としては、defineを使用すると、同じ文字が入った時のバグになってしまい、コードが多くなればなるほど、厄介みたいです。参考:https://teratail.com/questions/126674定数の設定:const AD = 4096; //AD変換の数値を4096→30にするための定数const VOLMAX = 30; //volumeの最大値必要変数:・スイッチ監視:sw1・AD変換保管用変数(割り込み):analog_Value・ボリューム格納変数:volume1・ボリューム保管用変数:volume2・送信用データ:vol_set[]={} next_set[]={}とりあえず、C言語で、volumeの値の変化したら実行する部分について確認する。//ーーーーーーーーーーーーーcode:c //変数の値、変化時に、OKを出力する。 (確認) #include <stdio.h> int main() { int a=0; int b=0; while(1){ printf("aの値を入力"); scanf("%d",&a); printf("a:%d\n",a); printf("b:%d\n",b); if(a != b) { printf("OK\n"); b = a; } } return 0; }//ーーーーーーーーーーーーーーーーーーーー 使用ブラウザ:https://replit.com/languages/c CubeMXの黄色の注意マークについて黄色の場合は、制限付きの場合、黄色になる。たぶん、今回のは、UART通信とADCで競合してるのかも?参考:https://www.st.com/content/ccc/resource/sales_and_marketing/presentation/product_presentation/group0/af/3a/5b/03/b6/c5/46/28/45.CubeMX%20Tool/files/45.STM32L4-Ecosystem-CubeMX%20Tool%20Final_JP.pdf/jcr:content/translations/ja.45.STM32L4-Ecosystem-CubeMX%20Tool%20Final_JP.pdfということで、プログラムを作成したが、出来ない・・・どうやら、vol_send={0x0F,・・・}の部分で、音量設定部分を、変数に変更すると、何故か音がでなくなる。Teratermでは、同じ数字が、送られてきているが、UART通信の、外部とのやり取りを使用とすると上手く行かないみたいだ。//ーーーーーーーーーーーーーーーーーーーーcode:c //UART送信データ 音量 uint8_t vol_set[]={0x7E,0xFF,0x06,0x06,0x00,0x00,0x0F,0xEF}; HAL_UART_Transmit(&huart1,vol_set,sizeof(vol_set),100); //これだと、普通に動作する。 uint8_t vol_set[]={0x7E,0xFF,0x06,0x06,0x00,0x00,volume1,0xEF}; uint8_t volume1 = 0x0F; HAL_UART_Transmit(&huart1,vol_set,sizeof(vol_set),100); //これだと、動作しない。 //ーーーーーーーーーーーーーーーーーーーー配列の確認:ブラウザ上で配列を作り、printfを使って出力してみる。使用ブラウザ: https://paiza.io/ja/projects/new //ーーーーーーーーーーーーーーーーーーcode:c #include <stdio.h> int main(void){ // Your code here! int vol_set[]={0x7E,0xFF,0x06,0x06,0x00,0x00,0x0F,0xEF}; //printf("vol_set:%d\n",vol_set[]); int vol = 0x0F; int vol_set2[]={0x7E,0xFF,0x06,0x06,0x00,0x00,vol,0xEF}; printf("vol_set1:%d\n",vol_set); printf("vol_set2:%d\n",vol_set2); for(int i=0;i<8;i++){ printf("vol_set1[%d]:%x\n",i,vol_set[i]); printf("vol_set2[%d]:%x\n",i,vol_set2[i]); } }//ーーーーーーーーーーーーーーーーーー変数を入れても、問題なく動作した。うーん、分からん・・・ちょっと眠くなってきたので、いったん休憩を入れる。再開する。DFplayerを使ってPICで制御 を見直す。とりあえず、配列の使い方について、考える。C言語で確認した方と、自分が作成したほうで、何が違うのか・・・・あ、分かったかもしれない。int vol = 0x0F;int vol_set2[]={0x7E,0xFF,0x06,0x06,0x00,0x00,vol,0xEF};の位置関係かも?int vol = 0x0F;int vol_set2[]={0x7E,0xFF,0x06,0x06,0x00,0x00,vol,0xEF};であれば、vol_set2[]のvolに0x0Fが入るが、int vol ;int vol_set2[]={0x7E,0xFF,0x06,0x06,0x00,0x00,vol,0xEF};vol = 0x0F;だと、vol_set2[]のvolに0x0Fは、入らないのかもしれない。STM32のプログラムだと、whileの中で、volumeの計算をしていて、配列の呼び出しは、最初にしてしまっているから、入っていない可能性がある。C言語ブラウザで確認//ーーーーーーーーーーーーーーーーーーーーcode:c #include <stdio.h> int main(void){ // Your code here! int vol_set[]={0x7E,0xFF,0x06,0x06,0x00,0x00,0x0F,0xEF}; //printf("vol_set:%d\n",vol_set[]); int vol = 0; int vol_set2[]={0x7E,0xFF,0x06,0x06,0x00,0x00,vol,0xEF}; vol = 0x0F; printf("vol_set1:%d\n",vol_set); printf("vol_set2:%d\n",vol_set2); for(int i=0;i<8;i++){ printf("vol_set1[%d]:%x\n",i,vol_set[i]); printf("vol_set2[%d]:%x\n",i,vol_set2[i]); } }//ーーーーーーーーーーーーーーーーーーーーやっぱり、volを後に数値を入れると、駄目っぽい。今日は、寝不足もあり、早めに寝ようと思うので、これで終わる。明日、STM32の方のプログラムも変更して確かめる。今日の作業:https://0000.studio/yuuu/contents/31fc7a71-4e24-4b1e-af48-1e772c62f0614.次回やりたいこと (1)配列の宣言位置と、変数の位置を変更するし、変数で入れることが出来るか確認する。 (2)DFplayerの音量を可変抵抗で調整。5.関連記事・STM32勉強日記(2021/6/19) ・STM32勉強日記(2021/6/27)・STM32勉強日記(2021/7/3)・STM32勉強日記(2021/7/4)・STM32勉強日記(2021/7/5)・STM32勉強日記(2021/7/6) :DFplayerが動かせた!!・STM32勉強日記(2021/7/7):スイッチの割り込み処理・STM32勉強日記(2021/7/9):スイッチの割り込み処理・STM32勉強日記(2021/7/10):ヘッダファイルについての学習