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

STM32에서 I2C(Inter-Integrated Circuit)는 마스터와 슬레이브 간의 데이터 통신을 위한 양방향 2와이어 직렬 버스입니다. I2C는 두 개의 주요 선을 사용합니다:
- SDA (Serial Data Line): 데이터 전송을 위한 선
- SCL (Serial Clock Line): 클럭 신호를 위한 선
주요 특징
- 마스터/슬레이브 구조: 마스터 장치가 클럭을 생성하고 통신을 제어합니다. 슬레이브 장치는 마스터의 명령에 따라 데이터를 송수신합니다.
- 주소 지정: 각 슬레이브 장치는 고유한 7비트 또는 10비트 주소를 가집니다.
- 속도 모드: 표준 모드(최대 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
바쁘게 실습한 날은 말보단 사진이 더 많네요...
이론 한 날이 적을게 많고 ㅎㅎ