이때 주의할 사항은 PWM과 사용하는 타이머가 겹칠수 있으므로 반드시 실험해서 잘 작동하나 확인해야 함.

 

좋은 설명 : https://youtu.be/LONGI_JcwEQ

샘플 코드. 출처 : techtutorialsx.com/2017/10/07/esp32-arduino-timer-interrupts/

volatile int interruptCounter;
int totalInterruptCounter;
 
hw_timer_t * timer = NULL;
portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED;
 
void IRAM_ATTR onTimer() {
  portENTER_CRITICAL_ISR(&timerMux);
  interruptCounter++;
  portEXIT_CRITICAL_ISR(&timerMux);
 
}
 
void setup() {
 
  Serial.begin(115200);
 
  timer = timerBegin(0, 80, true);
  timerAttachInterrupt(timer, &onTimer, true);
  timerAlarmWrite(timer, 1000000, true);
  timerAlarmEnable(timer);
 
}
 
void loop() {
 
  if (interruptCounter > 0) {
 
    portENTER_CRITICAL(&timerMux);
    interruptCounter--;
    portEXIT_CRITICAL(&timerMux);
 
    totalInterruptCounter++;
 
    Serial.print("An interrupt as occurred. Total number: ");
    Serial.println(totalInterruptCounter);
 
  }
}

============================================================================

ESP32 하드웨어 타이머 관련 기본 지식 :

  2 그룹의 2개씩의 64비트 하드웨어 타이머 (총 4개, 0 ~ 3)

   16 bit prescaler (2 ~ 2^16 사이의 값)

 

   ESP32는 80 Mhz짜리 수정(Crystal)을 사용하므로 (80,000,000 / prescaler) tics / sec 의 속도임.

   만약 80으로 나눠주면 80,000,000 / 80 = 1,000,000 tics / sec 이 됨.

 

   아두이노 코드에서 타이머를 사용하려면 다음과 같이 포인터를 만들어 주면 됨.

      hw_timer_t * timer = NULL;   // 포인터 설정.

 

   그 다음에는 타이머를 지정할 때 3개의 값을 주는데,

         1: 타이머 ID (0~3),

         2: 나눌 Prescaler 값,

         3: true (Rising Edge), false (Falling Edge) 

      timer = timerBegin(0, 80, true);  // 이건 타이머 0를 사용하고, 틱 80,000,000을 80으로 나누고, Rising Edge 사용.

 

  타이머를 Real Time용으로 만들기 위해서 아두이노 IDE에서는 다음과 같은 portMUX_TYPE 오브젝트를 사용함.

    portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED;

  

   타이머 함수를 만들어 줄 것. 

 

      (*) 타이머 함수를 만들때 주의사항.

        1. 코드가 아주 빨리 실행되는 일만 시킬 것.  (시리얼 통신같은 무거운 일 시키면 안됨)

        2. 각 코드는 고유의 타이머를 연결시킬 것.

        3. 타이머 함수에서 함수 외부 코드와 공유할 수 있는 변수는 반드시 (volatile)로 지정할 것.

           예 :  volatile  int  t0count;

        4. PWM 코드와 사용하는 타이머가 겹치는 지 반드시 확인할 것.

 

     코드 예 :

      void  IRAM_ATTR  onTimer() {

           portENTER_CRITICAL_ISR(&timerMux);

           t0count++;  // ... critical code executed in the RAM of the ESP32 

           portEXIT_CRITICAL_ISR(&timerMux);

      }

 

   타이머를 활성화(Enable) 시키기 전에 반드시 타이머 함수를 지정하고 연결시킬 것.

      timerAttachInterrupt(timer, &onTimer, true);

 

   그 다음에 알람용 (실제 시간마다 실행될 시간)을 지정함.

      timerAlarmWrite(timer, 1000000, true);    // 이전에 80으로 나눠서 1초에 백만 tic이 돌게 세팅된 상태에 

                                                                       // 백만 tic마다 실행하게 함.  그러므로 이 코드는 1초에 1번 작동함. 

 

   마지막에 타이머를 활성화(Enable) 시킴.

      timerAlarmEnable(timer);

 

 

 

 

     

티스토리가 카카오를 통해서만 동영상을 올리게 제한해 놓아서 관련 동영상은 모두 facebook에 올립니다. 

동영상 링크 :  www.facebook.com/permalink.php?story_fbid=4335689146551601&id=100003316754962

 

개요 

총 부품비 10만원 이하의 이 조그만 로봇은 기초 이론을 구현을 연습하기 위한 실습용으로 만들어 보는 로봇입니다.

이 로봇으로 이번에 실험할 내용들을 나열하자면

1. GPIO on/off (로봇의 모터 컨트롤러의 방향 세팅용)

2. PWM Timer (로봇의 바퀴 속도 조절용)

3. 센서와 I2C 통신 (BNO055 Absolute Orientation 9축 센서)

4. 인터럽트 (두개의 바퀴의 엔코더로부터 실제 바퀴가 도는 속도를 읽어 냄)

5. Wifi UDP 통신 (PC의 통합 모니터링 프로그램과의 교신)

      5.1 통신시 메세지 분석을 위한 Parsing 실력 양상. 

         (* 파싱은 프로그래머의 기초 체력,

            파싱 실력이 약하면 자료구조 알고리즘 공부가 불가능 함.   

            자료구조 알고리즘 공부가 안 된 프로그래머는 거의 단순 노가다임.  *)

      5.2 네트워크 관련 전반적 지식.  

6. PID - 1 (1개의 바퀴의 엔코더로부터 PID를 적용해 보기 - 속도 조절)

7. PID - 2 (2개의 바퀴로 PID 적용을 확산시키기 - 직선 주행)

8. PID - 3 (9축 센서에도 PID를 확장시키기 -  직선 주행)

9. PID - 4 (이젠 바닥을 불규칙하게 만들어서 실험하기)

10. 윗 PID 에 완전히 익숙해 지면 이젠 여러 속도와 다각도 커브 주행해 보기.

 

윗 작업이 다 끝나면 똑같은 작업을 Linux 환경인 파이에서 해 보는 것입니다.

파이에서 작동하는 방식은 Jetson과 거의 동일하기 때문에 저렴한 파이에서 실험합니다.

이때 주의할 점은 지나치게 raspberry pi 전용으로 만들어진 라이브러리는 피해야 합니다.   

그래야 Jetson이나 다른 리눅스용 SBC에 포팅이 쉽습니다.

======================================================================

아두이노용 라이브러리

PID  링크 : r-downing.github.io/AutoPID/

BNO055 링크 : github.com/adafruit/Adafruit_BNO055

======================================================================

사용하는 하드웨어 :

TTGO ESP32 Board,

N20 Low noise geared moter w/ encoder (60 rpm, 6V) x 2

TB6612FNG : Dual H-Bridge motor controller

14500 Li-Ion Batteries (Ultrafire brand) x 2 : 1,800 mAh each

GY-BNO055 : 9-axis sensor (absolute orientation), GY버전이 쌈.

TFT 1.3" LCD : for quick feedback. (취소. PC 모니터링 프로그램이 좋아서 불필요)

Step-down buck converter x 2. (8V => 5V, 6V)

MISC. : Some holdered, plastic plate, rubber wheels, battery holder

======================================================================

'ESP32 BOT > My ESP32 Bot' 카테고리의 다른 글

현재 코드 (11/4/2021) - 계속 바뀝니다.  (0) 2021.11.04

+ Recent posts