しろうさぎのblog

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

どうもしろうさぎです。

最近ネットを漁っていたら面白そうなものを見つけたので買って使ってみました。

CCS811 エアークオリティセンサモジュール

IMG_4121[1]
ものすごく小さいです。DIP化されてるからテストしやすくてよい。

んでもって使い方はストロベリーリナックスのモジュール説明書に書いてある通りにCubeHALを使って書いてみます。


こいつを一番最初に送ってあげます。
    cmd[0]=0xF4;
    HAL_I2C_Master_Transmit(&hi2c1,CCS811addr,(uint8_t*)cmd,1,0xf);
    cmd[0]=0x10;
    HAL_I2C_Mem_Write(&hi2c1,CCS811addr,0x01,I2C_MEMADD_SIZE_8BIT,(uint8_t*)cmd,1,0xf);

センサからの値をもらってきてCO2濃度とTVOCs濃度がある一定以上になったら0、1で返す関数を作成しました。

int environment(){
uint8_t returntemp[2]={0};
uint16_t data[2]={0};
uint8_t tempdata[8]={0};
    HAL_I2C_Mem_Read(&hi2c1,CCS811addr ,0x02,I2C_MEMADD_SIZE_8BIT,(uint8_t*)tempdata,8,0xF);
    data[0]=(tempdata[0]<<8)+tempdata[1];
    data[1]=(tempdata[2]<<8)+tempdata[3];
    if(data[0]>5000){returntemp[0]=1;}
    else{returntemp[1]=0;}
    if(data[1]>800){returntemp[0]=1;}
    else{returntemp[1]=0;}
xprintf(" CO2=%d",data[0]);
xprintf(" gas=%d",data[1]);
xprintf(" out=%d,%d",returntemp[0],returntemp[1]);
return (returntemp[0]+returntemp[1]*2);
}

この関数をコールするとxprintfを使ってUARTで生データを表示させることもしています。


実際に使ってみたものがこちら

キャプチャ1
こっちが最初

キャプチャ
息を吹きかけるとこのようにCO2濃度がちゃんと動く。

このやり方だと毎秒計測で、数値が返ってくるので応答性がいいかどうかといわれると微妙ですが、実際問題そこまで早くてもしょうがないかなとも思うのでこれで十分だと思われます。


このセンサは来年の機体に搭載される予定です。まぁレスキュー活動に直接関係はないですが、CO2濃度が高いところに長時間いると人体に影響があるのでそれの警告ができるようにということでアピールになるかなとおもい載せます。

まぁそこまでCPUのリソース食わないので・・・別にいいかなって・・・。

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








どうもしろうさぎです。

今回はサーボPWMをSTM32で吐き出させようと思います。といってもプリスケーラーやカウンターピリオドを適当に調整して作るのではなく、計算で求めて論理的にやってみたいと思います。

PWM周波数は以下の計算式から求めることができます。

frequency[Hz]=(TimClock[Hz]/Prescaler)/Counterperiod

TimClockはデーターシートとCube画面を見ることで確認することができます。

まず、データーシートで吐き出させようと思っているタイマーのAPBが1なのか2なのかを確認します。

キャプチャ1
キャプチャ2
データーシートのRCC→APB1 peripheral reset resisterのところに書いてあります。
私が来年使おうと思っているチップはまとめてあるのでそれを置いておきます。

STM32F767ZIT6
APB1(108MHz) TIM14  TIM13 TIM12 TIM7 TIM6 TIM5 TIM4 TIM3 TIM2
APB2(216Mhz) TIM11 TIM10 TIM9 TIM8 TIM1

STM32F746VET6
APB1(108MHz) TIM14 TIM13 TIM12 TIM7 TIM6 TIM5 TIM4 TIM3 TIM2
APB2(216MHz) TIM11 TIM10 TIM9 TIM8 TIM1

()内の周波数はあとで説明しますが、メインクロックを最大の216MHzにしてほかはそのままの時の値になります。

APB1なのか2なのかがわかったらCube画面でTimClockを確認します。

キャプチャ
例としてSTM32F746VETxの場合を示します。黄色いところがTimClockです。

ここで、TimClockがわかったらさっきの式を思い出して、サーボのPWM周期は多くは50Hzくらいなので50Hzを作ります。

STM32F746VET6のTIM4からPWMを出す例を挙げます。

50[Hz]=(108[MHz]/216)/10000

Tim4はAPB1で、カウンターピリオドは調整しやすいように10000とします。するとプリスケーラーは216でちょうどよくなります。
キャプチャ
カウンターピリオドは0から始まるため10000から1引いて9999になります。

これでCubeから吐き出してAtollic側でコードを書いていきます。

細かいところは割愛して(HALでPWMを出力する(2回目)を参考)、

#define SERVO_LOW 380
#define SERVO_HIGH 1120

uint8_t PULSE =90;

 sConfigOC.Pulse = map(PULSE,0,180,SERVO_LOW,SERVO_HIGH);
 if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
 {
 Error_Handler();
  }
  if (HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1) != HAL_OK)
  {
 Error_Handler();
  }

と記述します。

またこのmap関数は、

long map(long x, long in_min, long in_max, long out_min, long out_max) {
 return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

このようなもので、いちいちサーボで動かしたい角度とPWMデューティー比を計算して突っ込むのが面倒だったのでこのようにマイコンに計算させることにしました。まぁ、レスコンで使うためTPIPからデータを吐き出してそれをSTM32で受け取ってサーボを制御しようとすると、角度データが1バイトの中に入ってほしいのでこのようにしました。

これで後は、PULSという変数の中に0-180の値を入れてあげればその通りにサーボが動いてくれるはずです。

このmap関数に入れる出力値の上限と下限は、サーボによって異なるので少しづつ調節しました(なんかパルス長をどうしろっていう説明書がなくなっててだな・・・・)

まぁ大体は真ん中が1500μsで振れ幅が±500~600μsくらいです。

こんな感じです。
それではこの辺で



どうもしろうさぎです。

9月になり朝晩は急に涼しくなってきましたね。

夏休み真っただ中、免許をゲットして車乗るようになり行動範囲が広くなっているころです。車ってすごいですね。楽に移動できる。けど、まだ慣れてなくて手汗半端じゃないですけど・・・・。安全運転心がけます。

そんなことは置いておいて、今回はST-LinkをJlinkOB化して使ってみました。
きっかけはこちらの記事

普段私はSTM32を開発するときにNucleoのST-Linkをぶった切ってそれをフリスクケースに入れて使用しています。(ホットボンドで固めて固定しているのは見逃して)
IMG_4084
IMG_4085

それで自分の使いやすいようにコネクタはやして使っている感じです。

で、このST-LinkをJ-LinkOB化してみます。

ここのページ(https://www.segger.com/downloads/jlink)のST-Link Reflash Utilityのところからソフトを落とします。
キャプチャ
解凍したのち、開き、ST-LinkをPCにつなぎます。
そのあとは画面に従うだけです。
キャプチャ
Aを押して
キャプチャ1
もっかいA
キャプチャ2
ST-LinkにJlinkOBを書き込むときは1を押す。
キャプチャ3
完了するとこんな感じ。

デバイスマネージャーを開いてJlinkとして認識されてたら完璧です。


それでは、J-LinkOB化したST-Linkでデバッグしてみます。
キャプチャ
こんな感じで普通にデバッグできます。(ちなみにつないでるのはSTM32F746VET6)

最初のST-Linkとして使うときよりも起動もその他動作全体的に早くなるので結構快適にデバッグができるようになります。

ちなみにST-LinkのUARTの仮想COMポートも使えます。キャプチャ1
キャプチャ


今回はこの辺で。

↑このページのトップヘ