LoginSignup
0
0

More than 1 year has passed since last update.

STM32G031でI2Cスレーブで受信した値をアナログサーボに出力

Last updated at Posted at 2022-05-19

x 動作確認済み2022/5/20 15:20
x OBでリセットオンリーがわかる人むけ
x リセット改造かリセットを接続してください

目的
0x40(8ビット表記0x80)で値を受信して
アナログサーボ信号を出力
動くかどうかわからないがやつてみよう

とりあえず総当たりでpwm出力を調べる

1ピン
PB7 OK
PB8 OK
PB9 OK

4ピン
PA0 OK
PA1 OK
PA2 OK

5ピン
PA11 OK

仕様

1 I2C SDA
2 VDD
3 GND
4 リセットオンリー

8 SWD SWCLK - I2C SCL
7 SWD SWDIO
6 デバッグ出力用ソフトウェアシリアル
5 PWM

o_con465.jpg

プログラム(完成)




//I2C_PWM_031_1


#include <Arduino.h>
#include <Wire.h>

#define TX1      PA12  // 4pin
#define DD PA11    // potentiometer connected to analog pin x

#define DW   digitalWrite


#define UART_DELAY 102   //  9600bps ok 031

//仮想シリアルへの一文字出力 9600bps
int 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

  return (0);

}//pc_putc


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

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

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

  } //while

  //戻り値
  return (0);

}//pc_printf


//初期化
void setup()
{

  //ポートをhiにする 初期化
  pinMode(TX1, OUTPUT);
  DW(TX1, HIGH);
  pc_printf("STAR\r\n"); //debug

  pinMode(DD, OUTPUT);   // sets the LED pin as output
  analogWriteFrequency(50);
  analogWriteResolution(16);

  //I2Cの初期化
  //Wire.begin(PA12, PA11); //stm32g031
  Wire.begin();

  Wire.begin(0x40);  //I2Cスレーブアドレスの設定
  Wire.onReceive(receiveEvent); //データが来ると呼ばれる関数

} //setup


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


//レシーブイベント
void receiveEvent(int howMany) {

  int x = Wire.read(); //I2C受信データの読み込み

  char c_hex[] = {
    '0', '1', '2', '3', '4', '5', '6', '7',
    '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
  };

  char buf[] = { '[', c_hex[(x >> 4) & 0x0f], c_hex[x & 0x0f]  , ']', 0 };

  //char buf[] = { x, 0  };

  //I2Cスレーブの受信データの表示
  //pc_putc(x);
  pc_printf( buf ); //debug

  analogWrite(DD, 1310 + (26 * x) );  // analogRead values go from 0
                                      // to 4095, pwmWrite values
                                      // from 0 to 65535, so scale roughly


}//receiveEvent



A 41を連続


//I2C_A_031_1

#include <Arduino.h>
#include <Wire.h>

//STM32G031J6M6 i2cピンの定義
#define sdaPin PA12    // ArduinoA4
#define sclPin PA11    // ArduinoA5

//#define en     PB7     // 1pin

#define ADDR1  0x40

//初期化
void setup() {

  delay(3000); //not Delete

//  //GPIOの初期化
//  pinMode(en, OUTPUT);

  //i2cの初期化
  //Wire.begin(sdaPin, sclPin); //STM32G031J6M6
  Wire.begin();

}//setup

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

//  digitalWrite(en, 1); //LED ON debug

  //I2Cに送信
  Wire.beginTransmission(ADDR1);
  Wire.write('A');
  Wire.endTransmission();

  delay(500);//0.5秒待つ


//  digitalWrite(en, 0); //LED OFF debug
  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