KG_KAIROS/MCU (Arduino & STM32)

[KG_KAIROS] 서보모터 각도제어, HEX 프로토콜

projectlim 2024. 9. 4. 14:53
728x90
반응형
SMALL

오늘은 서보모터 제어!!!

 

 

 

 

 

 

STM32에서 I2C(Inter-Integrated Circuit)는 마스터와 슬레이브 간의 데이터 통신을 위한 양방향 2와이어 직렬 버스입니다. I2C는 두 개의 주요 선을 사용합니다:

  • SDA (Serial Data Line): 데이터 전송을 위한 선
  • SCL (Serial Clock Line): 클럭 신호를 위한 선

주요 특징

  1. 마스터/슬레이브 구조: 마스터 장치가 클럭을 생성하고 통신을 제어합니다. 슬레이브 장치는 마스터의 명령에 따라 데이터를 송수신합니다.
  2. 주소 지정: 각 슬레이브 장치는 고유한 7비트 또는 10비트 주소를 가집니다.
  3. 속도 모드: 표준 모드(최대 100kHz), 패스트 모드(최대 400kHz), 패스트 모드 플러스(최대 1MHz), 고속 모드(최대 3.4MHz)로 동작할 수 있습니다

 

i2c 실습

 

 

mpu6050은 강사님 코드로 대체

 

헤더파일은 비긴 인클루드 안에 넣어줘야 configuration이 바뀌어도 헤더들이 안지워짐.

/* USER CODE BEGIN Includes */

#include "main.h"

#include <stdio.h>

#include "i2c.h"

#include "MPU9250_2.h"

#include "mpu9250.h"

/* USER CODE END Includes */

 

 

/* USER CODE BEGIN WHILE */

while (1)

{

MPU9250_Read_All(&hi2c1, &mpu9250);

HAL_Delay(500);

printf("pitch: %lf roll: %lf yaw: %lf \r\n", mpu9250.KalmanAngleX, mpu9250.KalmanAngleY, mpu9250.KalmanAngleZ);

/* USER CODE END WHILE */

 

/* USER CODE BEGIN 3 */

}

/* USER CODE END 3 */

}

 

/* USER CODE BEGIN 4 */

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

{

if (htim == &htim7) {

HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_13);

}

}

 

 

/* USER CODE END 4 */

 

 

user code end 4 밑단에 아래 코드 작성

 

void __io_puchar (int ch)

{

(void)HAL_UART_Transmit(&huart2,(uint8_t*)&ch,1,100);

return ch;

}

 

 


#include <SoftwareSerial.h>
// Using softserial as debugging. Arduino Uno has only 1 serial port. 
SoftwareSerial Serial2(7,8);

void setup() {
  Serial.begin(115200);
  Serial2.begin(115200);
  Serial2.println("Start...");
}

long data = 0;  // 4 bytes       

void loop(){ 

  data += 100;
  Serial2.print( "data:" );    // print for debugging 
  Serial2.print( data );
 
  byte data_buffer[6] = {0};   // Command packer container 
  data_buffer[0] = 0xf5;
  data_buffer[1] = 4;
  data_buffer[2] = (data >> 24) & 0xff;     // long 4 bytes as byte array 
  data_buffer[3] = (data >> 16) & 0xff;    
  data_buffer[4] = (data >> 8) & 0xff;
  data_buffer[5] = data & 0xff;
 
  Serial.write(data_buffer, 5);  // Sending command packets 
  delay(1000);

}
import serial
import threading 
import time 

class JDamr(object):
    def __init__(self, com="COM3"):
        self.ser = serial.Serial(com, 115200)
        if self.ser.isOpen():
            print("JDamr serial port opened!")
        else:
            print("Can't open JDamr serial port!")
        time.sleep(1)
    
    def receive_data(self):     
        self.ser.flushInput()
       
        while True:
            head = bytearray(self.ser.read())[0]
            if head == 0xf5:
                payload = [] 
                length = bytearray(self.ser.read())[0]
                for i in range(length):
                    value = bytearray(self.ser.read())[0]
                    payload.append(value)
                self.parse_cmd(payload)

    def receive_thread(self):
        try:
            task_name = "serial_thread"
            rx_task = threading.Thread(target=self.receive_data, name=task_name)
            rx_task.setDaemon(True)
            rx_task.start()
            print("Start serial receive thread ")
            time.sleep(.05)
        except:
            pass

    def parse_cmd(self, payload):
        print(payload)
        encode1 =int.from_bytes(payload, byteorder="big")
        print(encode1)

if __name__ == '__main__':
    com = 'COM3'
    bot = JDamr(com)
    time.sleep(1)
    bot.receive_thread()
   
    while True:
       pass

 

아두이노랑 파이썬으로 해서 hex_protocol에 대해 알아봤습니다.

 

KG-KAIROS_robot/arduino_uno/hex_protocol_arduino_int_send at main · JD-edu/KG-KAIROS_robot

Contribute to JD-edu/KG-KAIROS_robot development by creating an account on GitHub.

github.com

 

바쁘게 실습한 날은 말보단 사진이 더 많네요...

이론 한 날이 적을게 많고 ㅎㅎ

728x90
반응형
LIST