しろうさぎのblog

ロボカップは小4の時に始めてかれこれ…。元将軍キャプテンです。 情報公開や交流用に作りました。気が向いたらアップしていく感じですのでよろしくです。最近まで関白のブログって名前でしたが、関白って名前使っていないので変えました。

どうも。サークルでもっとわかりやすくHALを使ってPWM吐かせる方法書けと言われたので書こうと思います。
今回はNucleo64(STM32F446RET6 )をベースに説明していきます。

とりあえずCubeのほうの設定
キャプチャ
Nuceloに既についている緑のユーザーLEDをPWMで光らせようと思います。
PA4をTimer2のCH1に設定してあげます。クロック設定は適当にやってください。
とりあえずST-Link部分を切り離していないNucleoであればバイパスクロック(St-Linkからのマスタークロックアウトを受け取る)を指定して8MhzをPULLで180Mhzに設定してあげました。
それで詳細設定。
キャプチャ1
プリスケーラーとカウンタ―ピリオドを設定します。プリスケーラー等々の設定の詳しい説明は省略します。とりあえずこのくらいにしてあげれば動きますよと。

それでSW4STM32とかAtollic True Studio等々に書き出してあげます。

どの環境では変わらないはずですが、私はAtollic環境でやりました。

インポートしたのちmain.cを開いて、

static void MX_TIM2_Init(void)
の関数内にいる

TIM_MasterConfigTypeDef sMasterConfig;
TIM_OC_InitTypeDef sConfigOC;
の2つをグルーバル変数化してあげます。

/* USER CODE BEGIN 0 */
の下にでも入れておいてあげてください。USER CODE BIGNとENDの間に入れてあげたコードはCubeで設定かえて新しくジェネレートした後でも消えないです。逆に言えばそれ以外のところは消えちゃうので注意です。

そして、int main()のWhile(1)内にこれを書いてあげます。

sConfigOC.Pulse = 100;
if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
{
Error_Handler();
}
if (HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1) != HAL_OK)
{
 Error_Handler();
}
HAL_Delay(1000);

sConfigOC.Pulse = 999;
if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
{
      Error_Handler();
}
if (HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1) != HAL_OK)
{
Error_Handler();
}
HAL_Delay(1000);

これを書き込むと、デューティー比10%と100%を1秒ごと繰り返すはずです。

sConfigOC.Pulse = 999;
でデューティー比(0~1000)を変数に設定します。ここの数字を変えることでいろいろ変化させることができます。

if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
 {
     Error_Handler();
}

でPWMデューティー比をTIMに投げてあげます

if (HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1) != HAL_OK)
{
 Error_Handler();
}
でPWM出力をスタートします。

まぁわかっているでしょうが、

HAL_Delay(1000);
は1秒間待ちます。

とりあえずこんな感じです。

ついでに少し応用編でUARTと合わせて使ってみたいと思います。
さっきの設定に追加でUSART2を追加します。

キャプチャ2
USART2の詳細設定は、

キャプチャ3
こんな感じにしてあげます。とりあえずここではTeraTermで見ることができるように合わせてあげてます。
それで再ジェネレートしてあげたところで、
さっきの通りTim2の

TIM_MasterConfigTypeDef sMasterConfig;
TIM_OC_InitTypeDef sConfigOC;
がいると思うので消えてたらグローバル化してあげてすでにあれば消しておいてあげてください
そしてグローバル変数に適当に

uint8_t uart_rx_buf;
uint8_t uart_Txbuf1[]="typpymofumofu\r\n";
uint8_t uart_Txbuf2[]="chinomofumofu\r\n";
uint8_t uart_Txbuf3[]="mofumofu\r\n";
的なものを用意してあげてさい。uart_Txbuf1[]とuart_Txbuf2[]の文字列はこれじゃなくても、もちろん何でもいいです。
それでさっきのPWM出力の部分を関数にしてあげます(何度も打つのが面倒だから)

void PWM(int pwm){

 sConfigOC.Pulse = pwm;
if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
 {
  Error_Handler();
 }
 if (HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1) != HAL_OK)
 {
  Error_Handler();
 }

}
こんな感じに。
そしてmainのwhile(1)内にこれを書いてあげます。

 uart_rx_buf=0;
 HAL_UART_Receive(&huart2,(uint8_t *)&uart_rx_buf,sizeof(uart_rx_buf), 0xF);

 if(uart_rx_buf=='a'){
 PWM(1000);
 HAL_UART_Transmit(&huart2,(uint8_t *)&uart_Txbuf1,sizeof(uart_Txbuf1), 0xF);

 }

 else if(uart_rx_buf=='b'){
 PWM(500);
 HAL_UART_Transmit(&huart2,(uint8_t *)&uart_Txbuf2,sizeof(uart_Txbuf2), 0xF);
 }

 else if(uart_rx_buf=='c'){
 PWM(100);
 HAL_UART_Transmit(&huart2,(uint8_t *)&uart_Txbuf3,sizeof(uart_Txbuf3), 0xF);
 }
それで書きこんであげて、TeraTermで「a」、「b」、「c」と打ち込んであげればそれに合わせた応答とそれに合わせてLEDの明るさが変化します。

  HAL_UART_Receive(&huart2,(uint8_t *)&uart_rx_buf,sizeof(uart_rx_buf), 0xF);
でUART経由で受け取り、uart_rx_bufの変数に格納します。
uart_rx_bufの値で条件分岐させたのち、PWMデューティー比を決めて、関数で投げてあげ、

 HAL_UART_Transmit(&huart2,(uint8_t *)&uart_Txbuf3,sizeof(uart_Txbuf3), 0xF);
でUART経由で’(この場合ではuart_Txbuf3の)配列の中身を送ります。

まぁこんな感じです。それでは今回はこの辺で。

どうもお久しぶりです。

 最近ElecrowでSTM基板を発注する際に小さい基板だったのでもったいないなぁと思い、9.9$でできる最大サイズまでほかの基板も一緒に乗せてしまおうと思いました。いろいろ調べていると普通は面付けをしてVカットをしてもらってぽきって割るそうなのですが、なにかVカットは別料金と聞いてそんなお金はないなぁということでほかの方法でやることにしました。
そこで、長穴を開けてそれできぽきっと折れるようにしてしまおうという作戦を試してみました。

まず発注したKiCAD画面から。
キャプチャ
このようにど真ん中に長穴を開けて基板を分けてます。微妙につながっているので送られたときはつながってますが手で折れるくらいになっています。
キャプチャ1
その長穴の設定画面です。
適当なネジ穴とかのフットプリントの定数をポチポチかえていくことでほしいサイズにします。
ElecrowだとNPTHは別ファイルで送って仕様書を英語で書かないといけないということで面倒なのでスルホールにしちゃってます(結果的には製造の関係からかスルホールじゃなくてNPTHみたいな感じになってます)
それで形状とドリルを楕円を指定してX、Yのサイズを指定してあげればOKです。どちらともサイズを一緒にしてしまって大丈夫です。
キャプチャ2
するとこんな感じに3Dで確認できます。
BlogPaint
んで出来上がってきた基板がこちら
BlogPaint
で、こんな感じにぱきっと折れます(ニッパで切ってもよい)。
バリが出るのでやすりで削って滑らかにしてしまえば完璧です。

こんなかんじです。それでは。



 

どうもお久しぶりです。
サークルでロボットグランプリ大道芸部門に参加してきました。 IMG_3097[1]
↑今回のロボット

僕自身は電装部分を作成しました。
IMG_3100[1]
今回はNucleoF446を使って制御しています。PCからシリアルでデータが送られそのシーケンス番号によって動作が決定され動作します。動作が終わると適当なデータを返して次の動作街をするようになっています。
Nucleoはmbedを用いてプログラムを書きました。I2CやらSPIやらGPIOやらADCなどろいろなペリフェラルを同時に使用しての初めての作品だったのでいい勉強になりました。
詳しい動作はサークルのブログを見れば書いてあるので探し出してみてください。

ンでもって結果は、準優勝で賞をいただくことができました!!!
副賞で近藤のサーボボードやらよさそうなテスターももらえて大満足ですwww

しかも前日の空き時間に秋葉原によって楽しむこともできたので万々歳でした。(フォロワーのある人が秋葉ついたといっただけなのに探し出してきて怖かったです)

今回ロボットグランプリに行ってランサー部門もやってみたいなと思ったので来年出てみようかと思います。
 
次はせとうちですかね。その次はレスコンです。 

それでは今日はこの辺で。 

↑このページのトップヘ