LoginSignup
0
0

More than 1 year has passed since last update.

STM32G031でアナログサーボ信号(PWM)を受信して9600bpsハードウェアシリアルにバイナリ出力(トリガー付)

Last updated at Posted at 2022-05-24

x 動作確認済み2022/5/25 8:05

目的
サーボ信号を受信してサーボ以外の別の機構を動かす。
使いがってが悪いのでトリガーを付ける

仕様

1 9600bps RX(トリガー(なんでもよい1文字))
2 VDD
3 GND
4 リセットオンリー

8 9600bps TX(0から255のPWMバイナリー値)
7
6 デバッグ出力 9600bpsソフトウェアシリアル
5 PWM(IN) 400uS=0,2400uS=255

デバッグ1

o_con491.jpg

o_con492.jpg

(成功) 138を送っている

o_con493.jpg

名前は、まだない


//PWM_to_SER_trigger_031_1


#include <Arduino.h>

#define in_pwm   PA11 // 5pin

//10の割り算 0から1028までは、正しい。主に0から999
#define DIV10(n) ((n*205)>>11)


#define DW   digitalWrite
#define TX1        PA12   // 6pin
#define UART_DELAY 106  // 002-110 9600bps ok 031

//仮想シリアルへの一文字出力 9600bps
void pc_putc(char ch)
{
  DW(TX1, HIGH);

  DW(TX1, LOW);//START
  delayMicroseconds(UART_DELAY); //START BIT WAIT

  for (int ii = 0; ii < 8; ii++) {
    DW(TX1, (ch >> ii) & 1  );
    delayMicroseconds(UART_DELAY); //DATA 1-8BIT WAIT
  }//for

  DW(TX1, HIGH);//Stop
  delayMicroseconds(UART_DELAY); //StOP BIT WAIT

}//pc_putc


//文字列の表示
int pc_printf(char *str1) {

  //文字の中身がゼロか
  while (*str1) {

    //一文字出力
    pc_putc(*str1 ++);

  } //while

  //戻り値
  return (0);
}//pc_printf


//初期化
void setup() {

  delay(3000); //not Delete

  Serial.begin(9600);

  pinMode(in_pwm, INPUT); //pa11

  //TXポートの初期化
  pinMode(TX1, OUTPUT);
  DW(TX1, HIGH);

  //pc_printf("<STgggg>\r\n"); //debug

} //setup


//メインループ
void loop()
{
  // pc_printf("L\r\n"); //debug

  //トリガー待ち
  // 受信データがあった時だけ、処理を行う
  while (!Serial.available()) {}      // 受信データがあるか?
  int u_key = Serial.read();            // 1文字だけ読み込む 空読み

  //PWMでデータ取得
  int pwmco2 = pulseIn(in_pwm, HIGH, 2000000);

  //  //データの表示 debug 1
  //  String thisString9 = String( pwmco2 );
  //  pc_printf( (char *)thisString9.c_str() );
  //  pc_printf( "\r\n" );

  if (pwmco2 <= 400  ) {
    pwmco2 = 400;
  }
  if (pwmco2 >= 2400 ) {
    pwmco2 = 2400;
  }

  pwmco2 = pwmco2 - 400;

  int vel = (pwmco2 * 523) >> 12;

  Serial.write(  (char)vel   );

  //  //データの表示 debug 2
  //  String thisString9 = String( vel );
  //  pc_printf( (char *)thisString9.c_str() );
  //  pc_printf( "\r\n" );

  // delay(500); //debug 後で消す

} //loop


arduino マスター




//PWM_SER_m_UNO_1


#include <Arduino.h>

#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3); // RX, TX


//初期化
void setup()
{

  //シリアルポートの初期化
  Serial.begin(9600);

  //ソフトウェアシリアルの初期化
  mySerial.begin(9600);

} //setup


//メインループ
void loop()
{

  //読み込み
  int b = 0;
  mySerial.print("S"); delay(5); //トリガーを投げる
  while ( mySerial.available() ) {
    //Serial.println( mySerial.available() );//debug
    b = mySerial.read();//受信
    //Serial.println( b );//debug

    Serial.print("255,"); //debug

    Serial.print( b ); //UNO

    Serial.print(",0");   //debug
    Serial.println();

  }//while

  delay(500); // 0.5秒の待ち

} //loop



0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0