본문 바로가기

임베디드 개발307

STM32 ] UDP Server, lwIP Raw API 출처 : https://controllerstech.com/stm32-ethenret-2-udp-server/ 위 헤더파일과 소스파일을 추가하고 while 문 전에 udpServer_init(); 함수를 추가한다. 그밖에는 이전과 설정이 똑같다. /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "udpServerRAW.h" /* USER CODE END Includes */ //... /* USER CODE BEGIN PV */ extern struct netif gnetif; /* USER CODE END PV */ //... int m.. 2022. 9. 25.
LwIP TCP/IP 스택 살펴보기 Developing applications on STM32Cube with LwIP TCP/IP stack LwIP (Lightweight IP)는 임베디드 시스템에서 널리 사용되는 오픈 소스 TCP/IP 스택이다. LwIP TCP/IP stack에서 지원하는 프로토콜 : IPv4, IPv6, ICMP, IGMP, UDP, TCP, DNS, SNMP, DHCP, PPP, ARP LwIP는 아래 3가지 API를 제공한다. Raw API : Native LwIP 로 event callback 형식으로 동작되며 최고의 성능을 제공하지만 사용하기 조금 복잡하다. Netconn API : Raw API 보다 High Level API로 RTOS 환경이 고려된 API이다. Socket API : 리눅스, 윈도우 등.. 2022. 9. 24.
STM32 ] LwIP 사용 초기설정 후 핑테스트 사용 보드 : STM32F429ZI 환경 : STM32CubeIDE 1.10.1 STM32Cube FW_F4 V1.27.1 without RTOS 먼저 클락 설정 ETH 설정 RMII 방식을 선택해준다. 이는 스키매틱을 보면 Nucleo-144 보드에는 LAN8742 라는 PHY 칩이 내장되어 있는데 이미 RMII 회로로 구성되어 있기 때문이다. Ethernet MAC 주소가 보이는데 앞의 3 byte는 생산자 코드이고 뒤의 3 byte는 시리얼 넘버이다. 디폴트로 내장된 PHY 칩을 사용할거기 때문에 Advanced Parameters 에도 건들 것이 없다. 다만 GPIO 핀 설정은 위의 스키매틱을 보면서 제대로 설정되었는지 확인해 줄 필요가 있다. 다음 Middleware에서 LwIP를 Enable .. 2022. 9. 24.
Ethernet, MAC, MII, RMII, GMII, RGMII PHY MCU에서 이더넷을 하기 위해 필요한 MAC과 PHY 그리고 MII, RMII에 대해 알아보자 아래 사진은 S/W Block과 H/W Block으로 구성된 OSI 7 Layer 이다.  그 중에 MAC과 PHY는 H/W Block에 위치해 있다. MAC은 데이터 링크 계층, PHY는 물리 계층이다. TCP/UDP 와 IP 까지는 S/W 에서 Packet을 만든 다음 전송은 MAC 과 PHY 을 통해서 하게 된다.이때 MAC 에서 PHY로 DATA가 전송하는  통신 방법으로 MII 와 RMII 등이 있다.   전체적인 흐름은 S/W에서 TCP/IP 또는 UDP/IP Packet을 만든 다음 MAC 으로 전달하고, MAC 에서는 추가로 헤더를 붙여 MII 방식을 통해서 PHY 로 전송하면 PHY 는 디지털 .. 2022. 9. 24.
STM32 + MFC ] 델타 로봇 티칭 시스템 구현, 파일입출력 기능 사용 티칭 데이터 관리, 쓰레드 활용 반복작업 수행 로봇의 티칭 방법 로봇에게 가르칠 수 있는 행동의 종류는 MOVE, WAIT, PUMP 세가지가 있고 각각 속성값을 지정할 수 있다. 1. MOVE : TORQUE OFF 버튼을 누른 뒤 사람 손으로 원하는 위치로 엔드 이펙터를 이동시킨 후에 READ 버튼을 클릭하면 현재 좌표값이 입력된다. 물론 좌표값을 직접 입력하는 것도 가능하다. 2. WAIT : 직전행동 후 대기시간을 설정한다. ms 단위로 0-5000 사이의 값을 입력할 수 있다. 3. PUMP : ON 또는 OFF를 선택한다. 원하는 행동의 라디오버튼을 클릭하고 속성값이 지정되었으면 ">" 버튼을 눌러 해당 행동을 기억시킬 수 있다. 기억된 행동은 순서대로 번호가 부여되며 중간에 행동을 끼워넣거나 "" 버튼 눌렀을 때의 이벤트 처리 함수 vo.. 2022. 9. 19.
TMS320F28388D ] 멀티 코어 사용하기 TMS320F28388D 모듈은 C28x 듀얼 코어에 CM(Connectivity Manager) 이라고 Arm Cortex-M4 까지붙어있다. TI에서 기본 제공하는 예제는 보면 듀얼 코어를 사용하는 예제와 CM을 사용하는 예제들이 많다. 그 중에 CM이 led blink 하는 예제를 실행해보겠다. 듀얼코어를 사용하는 방법도 다르지 않다. Import 하면 다음과 같이 프로젝트 두 개가 생성된다. 아래가 CPU1이 CM을 위해 pin mux 세팅을 해주는 부분, 위가 CM이 led blink 하는 부분으로 구성되어 있다. // // Included Files // #include "driverlib.h" #include "device.h" // // Main // void main(void) { // .. 2022. 9. 16.
TI ] CCS 에서 다른 Compiler 버전 사용하기 Help - Install New Software 사이트를 선택하고 원하는 버전의 컴파일러를 찾아 설치한다. 참고로 TI 사에서 제공하는 컴파일러는 CGT(Code Generation Tools) 라고 부른다. 만역 여기 목록에 원하는 버전이 없다면 TI 공홈에서 직접 다운받아도 된다. C2000 과 ARM core 컴파일러 다운로드 사이트 : https://www.ti.com/tool/C2000-CGT https://www.ti.com/tool/download/ARM-CGT 설치후 Window - Preference Refresh를 누르고 원하는 컴파일러 버전을 선택 후 Apply를 누른다. Project 우클릭 - Properties - General 에서 Compiler version을 선택할 수 .. 2022. 9. 16.
TMS320F28388D ] 멀티 코어 환경에서 디버깅하기 examples/cm 의 uart 예제를 찾아보면 CPU1(c28x) 코어가 uart config 하는 예제와 CM(ARM Cortex-M4) 코어가 uart echoback 을 수행하는 예제 두 개 가 보인다. 둘 다 import 한다. 첫 번째 예제는 CPU1이 CM의 UART 기능을 쓰기 위한 GPIO 핀 설정을 해주고 공유 주변장치를 할당해준다. // // Included Files // #include "driverlib.h" #include "device.h" void main(void) { // // Initialize device clock and peripherals // Device_init(); // // Boot CM core // #ifdef _FLASH Device_bootCM(.. 2022. 9. 14.
STM32 + MFC ] 델타 로봇, RTOS 구조 변경 + 슬라이더 컨트롤을 통한 좌표 이동 제어 먼저 STM32 부분 구조를 좀 바꿨다. Task 는 다음의 3개로 구성된다. 1. 각 조인트에 달린 모터의 각도를 읽고 정기구학을 통해 엔드이펙터의 좌표를 UART로 송신하는 Task (수행 중엔 다른 Task 보다 Priority 가 높을 필요가 있다) 2. 엔드이펙터의 좌표를 변경하라는 command 가 들어왔을 때 역기구학을 통해 모터의 각도를 제어하는 Task 3. UART 수신으로 command 가 들어오면 처리하는 Task 이렇게 3개가 있다. Queue는 엔드이펙터 좌표값을 넣는 SetQueue와 커맨드 문자열(cahr 배열 20byte)을 담든 cmdQueue가 있다. Semaphores는 1번 Task에 보내는 신호로 ReadPosSem을 하나 놔두고 다 지웠다. UART3 인터럽트 콜.. 2022. 9. 14.
TMS320F28388D ] ADC (ePWM 타이머를 사용한 Interrupt 방식) //// Included Files//#include "driverlib.h"#include "device.h"#include "board.h"//// Defines//#define RESULTS_BUFFER_SIZE 256//// Globals//uint16_t myADC0Results[RESULTS_BUFFER_SIZE]; // Buffer for resultsuint16_t index; // Index into result buffervolatile uint16_t bufferFull; // Flag to indicate buffer is full//// Function Pr.. 2022. 9. 13.
TI ] SysConfig 와 CCS 의 유용한 기능 1. pinmux.csv .syscfg 파일이 있는 프로젝트를 빌드하면 실행파일이 나오는 폴더 안의 syscfg 폴더 안 pinmux.csv 파일이 있다. 열어보면 아래와 같이 pinMux 세팅을 한눈에 볼수 있다. 해당 핀으로 사용가능한 기능, 현재 사용중인 모드 등을 볼 수 있고 엑셀의 필터기능을 사용하면 더 유용하게 쓸 수 있다. 2. Compare 소스파일을 누르고 오른쪽클릭 Compare With Local History 를 선택하면 아래와 같이 Revision History가 나오고 해당 시간을 클릭하면 어떤걸 수정했는지 확인할 수 있다. 파일 두 개를 선택하고 Compare Each Other 하는 것도 가능하다. 3. Outline CCS에서 Outline이 뜨지 않을때, 해당부분을 체크 .. 2022. 9. 12.
TMS320F28388D ] Watch Expressions (Continuous Refresh) STM32에서 Live Expression 과 같이 전역변수를 디버깅하며 실시간으로 관찰할 수 있는 기능이다. 첫번째 방법 보려고 하는 변수를 Expression 에 추가 Continuous Refresh 클릭 점 세개 누르고 Continuous Refresh Interval 클릭 최소 100ms 간격으로 refresh 되게 할 수 있다. 두번째 방법 Continuous Refresh 는 해제하고 해당 변수의 데이터가 변한 뒤 부분에 Breakpoint를 건다. (오른쪽 클릭 또는 파란 라인을 더블클릭해서 토글시킬 수 있다) 참고. Hardware Breakpoint는 CPU의 디버그 레지스터를 이용하는 방법으로 INT1을 사용한다. 속도는 빠르지만 설정할 수 있는 브레이크 포인트 개수에 한계가 있다. .. 2022. 9. 10.
CPU, MCU, MPU, DSP, FPGA 구분 On chip / SoC On chip은 하나의 IC에 제어, 연산, 입출력, 저장장치가 다 들어 있는 Stand alone 형태를 의미한다. SoC(System on Chip)과 같은 의미로 볼 수 있지만, 보통 SoC를 말하면 On chip + 특수기능을 하나의 칩에 구현하는 것을 의미한다. CPU (Central Processing Unit) CPU는 산술 및 논리 연산 유닛인 ALU(Arithmetic and Logical Unit)와 명령어를 읽어오고 해석해서 각 유닛을 제어하는 CU(Control Unit) 그리고 연산을 수행할 때 필요한 데이터를 빠르게 접근하고 처리하기 위해 사용되는 Register를 묶은 형태이다. CPU는 실행할 프로그램과 데이터, 입출력을 제어하는 역할을 하지만 I/O.. 2022. 9. 10.
TMS320F28388D ] External Interrupt 외부 인터럽트 데이터 시트 116페이지에 나와있듯이 외부 인터럽트는 5개 까지 지원된다. syscfg 설정 LED GPIO Output 설정 버튼 GPIO Input 설정 참고로 Qualification Mode는 디폴트가 Synchronization to SYSCLKOUT Only 이다. 그냥 단순히 SYSCLK에 동기화해서 들어오는 신호를 입력받겠다는 것이다. 여기서 Input Qualification 이란 (Technical Reference Guide 1639페이지 부터) 디지털 신호는 일반적으로 아날로그 신호보다 노이즈에 대한 내성이 더 강하므로 왜곡이 거의 없다고 볼 수 있는데 위의 그림처럼 (A)와 같은 노이즈가 발생하면 매우 곤란하다. 이런 경우에 Input Qualification 이 쓰일 수 있다. .. 2022. 9. 8.
TMS320F28388D ] SCI (UART) 통신하기 - 수신 인터럽트를 통한 에코백 설정은 이전 글에서 이어진다. 2022.09.07 - [DSP, MCU/TMS320F2838x (C28x)] - TMS320F28388D ] SCI (UART) 통신하기 - 송신 TMS320F28388D ] SCI (UART) 통신하기 - 송신 SCI : Serial Commnucation Interface 직렬 통신 인터페이스로 UART보다 광범위한 개념으로 쓰이지만 주로 UART 용도로 쓴다. 새 프로젝트를 만드는 것보다 .syscfg 가 있는 예제파일을 불러와 시작하는 것이 eteo.tistory.com interrupt를 수행하는 함수를 Interrupt Handler 또는 ISR (Interrupt Service Routine) 이라고 표현한다. 그리고 핸들러 함수를 만들때는 앞에 __inter.. 2022. 9. 8.
TMS320F28388D ] SCI (UART) 통신하기 - 송신 SCI : Serial Commnucation Interface 직렬 통신 인터페이스로 UART보다 광범위한 개념으로 쓰이지만 그중에 주로 UART 용도로 쓴다. 새 프로젝트를 만드는 것보다 .syscfg 가 있는 예제파일을 불러와 시작하는 것이 좋다. 프로젝트를 복붙해 sci_test 라는 프로젝트를 하나 만들고 .syscfg 파일을 더블클릭해 sysconfig tool 로 들어간다. 형관펜으로 표시한 버튼을 누르면 데이터시트 11페이지에도 있는 핀 다이어그램을 볼 수 있다. F2838x는 176-pin QFP 와 337-pin BGA 패키지가 있는데 내가 사용하는 모델은 337-pin BGA이다. 그리고 그 옆의 Show Generated Files 를 누르고 File name 을 클릭하면 sysco.. 2022. 9. 7.
TMS320F28388D ] 프로젝트 복사하기 Copy와 Paste로 복붙한다. 프로젝트명을 적어 복사한다. F2키를 눌러 .c 파일과 .syscfg 파일도 프로젝트명과 동일하게 바꾼다. 이전 빌드로 생긴 CPUx_RAM 또는 CPUx_FLASH 폴더는 지워준다. 링커 설정에 아래와 같이 되어 있기 때문에 빌드하면 생성되는 실행파일(.out)포함 출력물도 프로젝트명으로 생긴다. 참고로 STM32에선 .elf 로 생성됐었다. 필요한 경우 Debug Configuration 을 수정하고 디버그한다. 2022. 9. 7.
TMS320F2838x ] PIE Vector Table TI 의 PIE Vector table 행이 그룹이고 열이 채널이며 숫자가 낮을수록 더 높은 우선순위를 갖는다. 즉 여러 인터럽트가 펜딩 상태일 때 낮은 숫자 그룹의 낮은 채널 인터럽트가 먼저 실행된다. 테크니컬 레퍼런스 매뉴얼 153-158 페이지 더 자세한 내용을 확인할 수 있다. https://www.ti.com/lit/ug/spruii0d/spruii0d.pdf?ts=1662539879473 2022. 9. 7.
CMD 파일 (linker command files) 작성 팁 공식 홈페이지의 작성 팁 : https://software-dl.ti.com/ccs/esd/documents/sdto_cgt_Linker-Command-File-Primer.html#barely-beyond-basics TI Linker Command File Primer software-dl.ti.com 하기 자료 출처 : http://mcublog.co.kr/ (timcu) TI MCU 카페 mcublog.co.kr TI DSP 개발에 관련하여 CMD 파일의 작성법에 대해 아는 사람은 알고 모르는 사람은 모르는 몇 가지 간단한 팁을 알려드리겠습니다. CMD 파일은 보통 아래와 같이 MEMORY{}에서 사용하는 DSP의 메모리 영역을 정의하고, SECTION{}에서 섹션들을 MEMORY{}에서 정의된 .. 2022. 9. 7.
DSP ] C28x 계열 Data Types 출처 : https://www.ti.com/lit/ug/spru514p/spru514p.pdf 이 코어는 고속연산과 자료 저장의 효율성을 위해서 기본 word단위를 16비트로 사용하고 있기 때문에 자료형 선정 시 주의가 필요하다. char 가 16비트, int 가 16비트, long이 32비트 실수 자료형은 float 와 double 둘다 32비트이다 리틀엔디안 방식이라 예를들어 0x12345678 을 저장하면 메모리에 0x56781234 로 저장된다. 2022. 9. 6.
JTAG 에뮬레이터를 연결해서 사용하기 On Board USB JTAG 에뮬레이션 회로를 사용하지 않고 14핀 JTAG 인터페이스 통해 에뮬레이터를 사용하기. 사용할 에뮬레이터는 Blackhawk USB560 v2 System Trace CCS 설치파일을 다시 실행해서 Blackhawk Debug Probes 설치 14-Pin TI Adapter Pinout 보통 방향 잘못꼽는것을 막기 위해 여기서 NC (Not/Connected)부분은 핀헤더가 부러져있거나 막혀있다. 케이블을 연결하고 설치하면 장치 관리자에서 잡힌다. 싱크웍스 DOCK 보드 내장 JTAG 회로 비활성화 프로젝트 Properties에서 Connection 선택 2022. 9. 5.
STM32 ] 델타로봇, UART로 Command Line Interface 구현 + 기판에 다시 납땜 (5) 2022.08.25 - [프로그래밍/C] - C ] 명령 프롬프트 구현 (함수포인터 사용) C ] 명령 프롬프트 구현 (함수포인터 사용) #include #include /* for strcmp() strlen*/ //#include /* for usleep() */ #include #include #define MAX_CMD_NUM 10 #define BUF_LEN 128 int cmd_continue = 0; typedef int cmd_func(int argc, char* argv[.. eteo.tistory.com 이전에 콘솔에서 구현했었던 명령 프롬프트를 가져와 STM32에서 UART로 Command Line Interface를 구현하고 간단하게 델타로봇을 제어해봤다. cli.h /* * cli.. 2022. 9. 4.
TMS320F28388D ] 예제파일 불러오는방법 (LED Blink) C2000ware 설치 Texas Instruments 사가 개발자들을 대상으로 칩에 대해 제공하는 각종 자료들(데이터시트, 칩 매뉴얼, 기본 예제 및 소스, 라이브러리 등)이 담긴 C2000ware 를 다운로드해 설치한다. (설치 folder path : C:\ti\c2000) https://www.ti.com/tool/C2000WARE 첫번째 방법 Project explorer 에서 import - CCS Projects Browse 클릭 - C2000ware가 설치된 폴더 안의 driverlib - 디바이스명 폴더를 선택한다. 참고로 driverlib 폴더에는 HAL(Hardware Abstraction Layer) driver를 사용한 예제, device_support 폴더에는 레지스터를 조작해 .. 2022. 9. 3.
TI ] CCS (Code Composer Studio) 설치하기 + 새 프로젝트 만들기 이글은 TMS320F2838x 를 바탕으로 쓰여졌습니다. 먼저 TI 사의 DSP를 사용하기 위한 툴인 CCS를 설치한다. https://www.ti.com/tool/download/CCSTUDIO Rdcommended 인 커스텀 설치 선택 해당되는 제품군을 선택 Debug probes 선택. 필요하면 나중에 추가설치 할 수 있다. CCS를 사용하면 내장 JTAG 에뮬레이터(=Debug Probe)를 위한 FTDI Driver가 같이 설치되기 때문에 5핀 케이블로 PC와 연결을 하면 다음과 같이 장치 관리자에 뜬다. CCS 실행 실행 후 첫 화면 New CCS Project 만들기 먼저 타겟보드를 선택하고 Connection에서 맞는 Debug Probe를 선택한다. 옆의 Verify를 누르면 스캔 테스트.. 2022. 9. 3.
빅 엔디안(Big Endian)과 리틀 엔디안(Little Endian) 컴퓨터는 데이터를 메모리에 저장할 때 바이트(byte) 단위로 나눠서 저장한다. 하지만 컴퓨터가 저장하는 데이터는 대게 32비트(4바이트)나 64비트(8바이트)로 구성된다. 따라서 이렇게 연속되는 바이트를 순서대로 저장해야 하는데, 이것을 바이트 저장 순서(바이트 오더 : byte order)라고 한다. 바이트 오더는 빅 엔디안(big endian) 과 리틀 엔디안(little endian) 방식이 있다. 빅 엔디안은 메모리의 Lower Address 에 MSB (최상위비트/Most Significant Bit) 부터 저장하는 방식이고, 리틀 엔디안은 메모리의 Lower Address 에 LSB (최하위비트/Least Significant Bit) 부터 저장하는 방식이다. 아래 예시에서 Data의 MSB.. 2022. 8. 31.
STM32 ] 델타로봇과 MFC 연동 + 컨베이어 벨트 추가 (4) 컨베이어 벨트 추가 컨베이어 벨트에 달린 모터는 델타 로봇에 쓰인 것과 동일한 모델인 AX-12A 모터이다. Daisy Chain으로 연결하고 ID를 3으로 지정하고, Baudrate를 115200으로 맞춰줬다. 처음엔 모터 혼이 저 큰 구멍에 위치하게 배치되어 있었는데 테스트 구동을 해보니 장력 부족으로 벨트가 잘 돌아가지 않는 것 같아 뒤로 당겨서 배치해주었다. #define AX_CONVEYOR_ID3 dxl_control.c void setEndless(uint8_t ID, uint8_t State) { if ( State ) { uint8_t length = 9; uint8_t packet[length]; packet[0] = AX_HEADER; packet[1] = AX_HEADER; pack.. 2022. 8. 28.
STM32 ] USB CDC (Virtual Port Com) 사용하기 Clock Configuration USB 클럭이 PLL에서 나오는 48MHz로 설정되어 있어야 한다. Activate Clock Source Ethernet Disable USB_OTG_FS 설정. Device_only 모드로 Middleware - USB_DEVICE 에서 Class For FS IP 를 CDC (Communication Device 클래스)로 설정 Generation Code를 하면 프로젝트 안에 아래와 같이 폴더가 추가된 것을 볼 수 있다. 그 중에서도 usb 송수신 관련된 함수들은 usbd_cdc_if.c 파일 안에 있다. 소스코드 /* USER CODE BEGIN 0 */ #define BUF_SIZE 30 uint8_t usb_buf[BUF_SIZE]; uint32_t cou.. 2022. 8. 26.
STM32 ] 역기구학(Inverse kinematics)을 통한 델타로봇 제어 (3) 로봇은 관절(Joint)에 붙어있는 모터로 조인트 각도를 제어하여 움직인다. 그리고 실제 그리퍼가 붙어 주어진 작업을 수행하는 말단 장치(End Effector)의 위치는 조인트 각도로부터 결정된다. 조인트 각도와 엔드 이펙터의 위치, 이 둘 사이를 변환하는 계산 과정을 기구학 이라고 한다. 이 중 정기구학(Forward Kinematics)은 일련의 조인트 각도가 주어졌을 때 엔드 이펙터의 직교좌표상 위치를 구하는 과정이고 역기구학(Inverse Kinematics)은 엔드 이펙터의 직교좌표상 위치에 대응하는 조인트 각도를 구하는 과정이다. https://www.marginallyclever.com/other/samples/fk-ik-test.html Delta Robot Forward/Inverse .. 2022. 8. 22.
STM32 ] UART DMA, IDLE Line Interrupt 를 통한 데이터 수신 (Ring Buffer) 코드 출처 : https://controllerstech.com/uart-dma-with-idle-line-detection/ 이전에 UART로 원하는 형식의 데이터를 수신할 때는 패킷의 종료를 뜻하는 특정 문자를 끝에 넣거나 개행 문자를 넣어서 인터럽트 안에서 버퍼에 복사해 처리해야했는데 이 때는 수신될 데이터의 길이 또는 범위를 미리 알고 있어야 했다. 다음은 UART가 IDLE Line을 감지하고 발생시키는 Interrupt를 활용하여 사전에 길이를 알 수 없는 데이터를 효과적으로 수신하는 방법이다. CubeMX 설정 파라미터 세팅은 그대로 두고 DMA 세팅으로 가서 RX Request를 추가한다. Mode는 Normal으로 한다. Direction은 Peripheral To Memory 이고 By.. 2022. 8. 18.
STM32 ] Dynamixel AX-12 사용 - 델타로봇 제어하기 (2) 내가 프로젝트에서 사용하는 델타 로봇은 산업에서 많이쓰이는 병렬 로봇이며 3축 DOF (Degree of Freedom) 를 갖는다. 참고. 직렬로봇 : 1개의 직렬체인(다리)으로 구성되고, 모든 조인트에 구동기가 장착된다. 병렬로봇 : 엔드이펙터가 적어도 2개 이상의 다리에 의하여 지지되고, 각 다리당 1~2개의 구동기가 고정부 근처에 장착되며 나머지 조인트는 수동조인트로 구성된다. 일단 FreeRTOS를 사용했는데 현재는 하나의 Task만 쓰고 있다. Motor Init() 시점에서 속도를 미리 설정해서 지난번보다 부드럽게 움직이게끔 했고, UART Receive 인터럽트에서 세마포어 시그널을 보내서 시리얼 터미널로 PC에서 제어가 가능하게 끔 해놨다. 구현해놓은 커맨드는 우선 End Effector.. 2022. 8. 11.