しろうさぎのblog

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

どうもです。
先日行われたせとうちオープン2017に参加してきました。
今回も北九州オープン2016と同じくHAKUTOの一人と私でチームを組んで出ました。
IMG_3422
おそらくこのせとうちオープンが最後になるであろうチームです。

試合はスイス式で行われ、(運営の方々お疲れ様です)とりあえず結果は、4位でした。
result_WSO
まぁ北九州オープンのようにほぼ年齢超えて、ロボットもほぼネタに走っている人が表彰台に載ってしまうということはなかったようですw
それでもこの順位なので一部からは名勝負メーカーとか謎のあだ名をつけられたり、見た目は白いけど中身は黒いロボットと言われたりしてました。

アウトオブバウンズをしない(今回はもうティッピーのハードが限界に近かったのでちょこちょこ出てしまっていたけれど。なんせおととし作ってそれをだましだまし運用しているから仕方ない部分もある)、ボールをしっかり追って故障でコートから出すことはない、ゴールを決めるべきところでちゃんとゴールを決める。この3つができていれば、強豪相手にもそこそこいい試合ができるはずなのです。
この基本をおろそかにしてしまってほかのマカオシュートなどにチャレンジばかりしているチームが最近多いようにも感じられたりします。先ほどの基本ができたうえで何か一つ武器となるものを持てばジャパンで簡単に勝てるようになると思います。

IMG_3410 (2)
↑オーバーエイジ枠のロボットたちの集合写真

IMG_3416
↑オープンリーグのロボットの一部で集合写真(ワイのところ以外ほとんどが超強豪というね)

以下に試合の動画を張っておきます。




2日目のビッグフィールドはおとな(げない)チームとして参加しました。言ってしまうとメンターが作ったロボットと引退したOBの作ったロボットを集めてひとチーム作ったって感じです。こちらは4チーム中3位でした。(ほんとに一個現役よりも勝ってしまいおとなげなくなった)
私のうさぎは足が非常に遅いためビッグフィールドでは全く活躍できずただコートにいるだけの存在になってました。ビッグフィールドになるとロボットの速度がかなり浮き出てきます。普通のコートはあれだけ狭いため速度差はほぼ見えないのですが、あれだけ広いとダメです。
C_Jc9lKUIAIrIWY

ビッグフィールドの動画は上げていないのでなしで。

最後に口頭プレゼンをしました。内容はロボカップとの出会いやロボカップとの付き合い方、どのように技術を得るか、大学でどのようなことをしているのかなどについて話しました。どっかの誰かさんがYoutubeにあげて(しまった)らしいので探せるもんなら探してみてください。なかなか好評だったので良かったですが、若干スライドに文字が多いといわれたので次回やる機会があったら修正しておこうと思います。そのうちここで話した内容をブログにもまとめておきたいと思います。

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





どうも。サークルでもっとわかりやすく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
で、こんな感じにぱきっと折れます(ニッパで切ってもよい)。
バリが出るのでやすりで削って滑らかにしてしまえば完璧です。

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



 

↑このページのトップヘ