投稿

STM32での圧電スピーカーの使い方

イメージ
前回はArduinoで圧電スピーカーを使ってみたので、今度はSTM32で使っていきたい。 CubeMXでピンの設定を行う 圧電スピーカーを使うので「A0」のアナログピンを使うことにした。 設定は「PA0」を「TIM2_CH1」に設定する。 TimersからTIM2の設定を変更する。 ModeのChannel1を「PWM Generation CH1」に設定する。 ConfigrationのParameter SettingsのPrescalerを「84」に設定する。 設定が終わったら、保存を行いコードを更新する。 main.cでプログラムを書いていく Arduinoのtone()関数をSTM32ようにモドキ物を作成してみた。 TIM_MasterConfigTypeDef sMasterConfig = {0}; TIM_OC_InitTypeDef sConfigOC = {0}; int period; void periodSet(int p){ htim2.Init.Period = p; sConfigOC.Pulse = p/2; HAL_TIM_Base_Init(&htim2); HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1); } void tone(int freq,int ms){ long peri; peri=1000000L/(long)freq; period = (uint16_t)peri; //htim2.Init.Period = Hz; //HAL_TIM_Base_Init(&htim3); periodSet(period); HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1); HAL_Delay(ms); } void noTone(int ms){ HAL_TIM_PWM_Stop(&htim2,TIM_CHANNEL_1); HAL_Delay(ms); } MX_TIM2_Initの関数にある下の二行をコメントアウトしておく。 TIM_MasterConfigTypeDef

Arduinoでの圧電スピーカーの使い方(tone関数)

イメージ
Arduinoで簡単な音楽を流してみたいと思う。 圧電スピーカーならオルゴール音みたいな感じにできると思うので使っていく。 圧電スピーカーの回路を作る 回路を作ると書いているが、作るのはいたってシンプル。 Arduinoのアナログピンに圧電スピーカーをつなげるだけ。 今回は「A0」ピンからGNDにつなげた。 圧電スピーカーは秋月電子より購入。 秋月電子→ http://akizukidenshi.com/catalog/g/gP-04118/ ArduinoIDEのプログラム Arduinoには「tone()関数」というものがある。 簡単に説明すると、出力するピンと周波数、出力時間を引数として代入することが出来る関数になる。 周波数は音の音階によって異なってくる。 代表的なドレミ音の周波数はこのような感じになってくる。 音階 ド レ ミ ファ ソ ラ シ ド 周波数 261Hz 293Hz 329Hz 349Hz 391Hz 440Hz 493Hz 523Hz 今回は#音については除外させてもらった。 詳しい音階の周波数を知りたい人は自分で調べてほしい。 これを使って簡単なメロディを流すプログラムを作成した。 #define PIN_SPK (A0) void setup() { pinMode(A0,OUTPUT); delay(1000); } void loop() { tone(PIN_SPK,261,500); //ド delay(500); tone(PIN_SPK,293,500); //レ delay(500); tone(PIN_SPK,329,500); //ミ delay(500); tone(PIN_SPK,349,500); //ファ delay(500); tone(PIN_SPK,391,500); //ソ delay(500); tone(PIN_SPK,440,500); //ラ delay(500); tone(PIN_SPK,493,500); //シ delay(500); tone(PIN_SPK,523,500); //ド d

STM32F401 PWM制御のやり方・使い方

イメージ
  CubeMXでピンの設定を行う 今回はSTM32でPWM制御をやってみたい。 どうやら、TIMというものを使って行っていくらしい。 その中でも、TIM6とTIM7というものが割と使いやすいものらしい。 しかし、STM32F401にはTIM6やTIM7といった設定が見当たらない・・・。 調べたら、TIM2を使って似たようなことをやっている人がいたので、その人の記事を参考にしてやっていこうと思う ピンの設定を行う。 参考記事通りに今回はオンボードのLEDを使っていこうと思う。 まずは「PA5」を「TIM2_CH1」に変更する。 ピンの設定で「Timers」→「TIM2」を選択する。 「Mode」の「Channel1」を「PWM Generation CH1」にする。 「Prescaler」を0から「3」にする。 「Counter Period」を「999」にする。 設定できたら、保存を行いソースコードの更新を行う。 main.cでプログラムを書いていく 参考記事には「static void MX_TIM2_Init(void)」関数内にある 「TIM_masterConfigTypeDef smasterConfig」と「TIM_OC_InitTyapeDef sConfigOC」をグローバル変数にすると書いてあるので、まずはその二つをこんな感じにコメントアウトしておく。 static void MX_TIM2_Init(void) { /* USER CODE BEGIN TIM2_Init 0 */ /* USER CODE END TIM2_Init 0 */ //TIM_MasterConfigTypeDef sMasterConfig = {0}; //TIM_OC_InitTypeDef sConfigOC = {0}; /* USER CODE BEGIN TIM2_Init 1 */ /* USER CODE END TIM2_Init 1 */ htim2.Instance = TIM2; htim2.Init.Prescaler = 3; htim2.Init.CounterMode = TIM_COUNTERMODE_

STM32F401でのアナログジョイスティックの使い方

イメージ
STM32F401-Nucleoでアナログジョイスティックを使おうと思う。 そのためにはDMA変換をつかってアナログ入力を2チャンネルで行う必要がある。 STM32を使うと、だいたいDMAが難しくて挫折したくなる。 しかし、難しいけど覚えると非常に便利な機能なのでぜひとも使っていきたい。 DMAとは Direct Memory Access(ダイレクトメモリーアクセス)の略。 ピンから読みこまれたアナログデータを変換して特定のレジスタに格納してくれる。 CPUは毎回、そこを確認すれば入力されたデータを確認できるのでCPUに余計な負荷をかけなくて済む。 要約すると、メモリ間のデータのやり取りをCPUを使わずに行えるものである。 しかし、よくわからないので複数のADCを使えるのも位の感覚でいいと思う。 ADC以外でも使えるみたいだけど、まだよくわからないので勉強していこうと思う。 CubeMXでピンの設定を行う まずはピンにADCを使う設定を行う。 二つ使うので「A0」と「A1」を使っていく。 STM32では「PA0」と「PA1」になる。 [Analog]→[ADC1]で詳細設定画面を開く。 [DMA_Settings]をクリックする。 「Add」をクリックする。 「DMA Request」を「ADC1」にする。 「DMA Request Settings」のModeを「Circular」に設定する。 「Priority」を「High」にする。 「Parameter Settings」クリックして詳細設定を行っていく。 [ADC_Settings]から設定する。 「Scan Conversion Mode」を「Enabled」にする。 「Continuous Conversion Mode」を「Enabled」にする。 「Discontinuous Conversion Mode」を「Disabled」にする。 「DMA Continuous Requests」を「Enabled」にする。 それ以外の設定はデフォルトの設定で何もいじらない。 [ADC_Regular_ConversionMode]の設定。 「Number Of Conversion」を「2」にする。

STM32F401のADCの使い方

イメージ
STM32でADCの使い方をまとめる。 これはSTM32でアナログジョイスティックを使うための前段階の勉強になる。 CubeMXでピンの設定を行う STM32F401-Nucleoでアナログ入力を行えるピンは、Arduinoと同じ。 なので「A0」ピンを使っていこうと思う。 調べるとA0は「PA0」になるようだ。 PA0を選択して「ADC1_INO」に設定する。 ピンの設定はこれで終了。 ADC一つだけならこれだけで使える。 main.cでプログラムを書いていく まずは「USER CODE BIGEN Includes」に「<stdio.h>」と「<string.h>」をインクルードする。 /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include <stdio.h> #include <string.h> /* USER CODE END Includes */ あとはmain関数にこれらのコードを記述する。 /* USER CODE BEGIN WHILE */ int adc = 1; char str[16]; while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ HAL_ADC_Start(&hadc1); HAL_ADC_PollForConversion(&hadc1, 100); adc = HAL_ADC_GetValue(&hadc1); sprintf(str, "ADC: %d\n\r", adc); HAL_UART_Transmit(&huart2, (uint8_t *)str, strlen(str), 1000); HAL_ADC_Stop(&hadc1); HAL_Delay(300); } /* US

C言語のおさらい 配列の考え方・使い方

イメージ
配列とは データ処理をしていくとき、同じ型の変数を複数まとめて用意しておくほうが、便利な場合がある。そういうときに使うのが「 配列 」である。 配列には「 一次元配列 」と「 二 次元配列 」がある。 配列を使ったプログラムを書いてみる。 一次元配列 一次元配列のイメージとして、このような表を作成すると思ったほうが良い。                 Excelの一行分を作成して、それぞれ数値を代入できる変数を作成する感じ。 一次元配列の宣言 データ型 配列名[要素数]; 配列を構成する一つ一つの変数を「 配列要素 」または「 要素 」という。 それぞれの要素を判別するために、「 添え字 」という先頭から何番目かを示すための数字を一緒に使う。 一次元配列を書いてみる 一次元配列を使ったプログラムを実際に書く。 #include <stdio.h> int main(void) { //変数の宣言 int score[5]; int ans; //入力 printf("5教科の点数を入力する。\n"); printf("国語の点数→"); scanf("%d", &score[0]); printf("数学の点数→"); scanf("%d", &score[1]); printf("理科の点数→"); scanf("%d", &score[2]); printf("社会の点数→"); scanf("%d", &score[3]); printf("英語の点数→"); scanf("%d", &score[4]); //処理 ans = score[0] + score[1] + score[2] + score[3] + score[4]; //出力 printf("

C言語のおさらい プログラムのモジュール化の考え方・使い方

イメージ
モジュール化とは プログラムが複雑化し大きくなればなるほど、わかりにくくなります。 それをわかりやすくするために、プログラムをいくつかの小さな部分(モジュール化)に分割していく必要がある。 これを「 プログラムのモジュール化 」といい、構造化プログラムのもう一つの考え方である。 「プログラムのモジュール化」のメリットがいくつかある。 一つ一つのモジュールは小さいのでわかりやすい。 モジュール単位で機能がまとまっていると、プログラムの変更(改良)がしやすい。 大きなプログラムを複数の人間で分担して開発できる。 一つのモジュールはなるべく一つの機能だけを持つようにする。これがモジュール化の重要なところ。 関数とは C言語では分割したモジュールを「 関数 」として扱う。なので、「 C言語プログラムとは、関数の集まりである 」といえる。 今まで使ったprintf()関数で考えてみる。データを一定の書式に従ってディスプレイに表示するには、さまざまな命令を合わせる必要がある。この命令群を毎回書いていてはプログラムが大きくなって、わかりにくくなる。 そこで、命令群をモジュール(関数)として分割すれば、プログラムを作成するときに出力の命令群を毎回書く必要がなくなり、負担が少なくなる。 C言語では、よく使われる関数は、あらかじめヘッダファイルに用意してある。このヘッダファイルをプログラムの1行目に「#include <stdio.h>」と書くことで、好きなように使える。このような関数を「標準関数」という。 標準関数以外の命令をモジュール化したいときは、プログラム作成者自身が関数として定義することができる。定義の仕方は、分割したモジュールに名前(関数名)をつけて、別の場所に書くだけ。あとは使いたいときにモジュールの関数名を指定すればいい。これを「 関数の呼び出し 」という。 関数のデータのやり取りの仕方 引数と戻り値 C言語の関数でデータのやり取りをするるには、「 引数 」と「 戻り値 」を使う方法が簡単である。引数とは、関数に入力するデータで、戻り値とは関数から出力されるデータである。引数は必要に応じて複数指定できるが、戻り値は一つしかない。 呼び出した側から渡す引