본문 바로가기
Computer Science/Embedded System Design

[임베디드] 1장 아두이노보드 실습 (2)

by na1-4an 2023. 10. 20.

실습5. 모터 제어

  - 모터 종류(6): AC모터, DC모터, BLDC모터, Servo모터, Stepping 모터, Geared 모터

  - DC모터 사용.

  - 트랜지스터: 전류 흐름을 스위칭(디지털)하거나 증폭(아날로그)

  • 스위칭 - off: 베이스(B)에 0V(low)가 주어지면 에미터(E)에서 콜렉터(C)로의 전류 흐름이 멈춤.
  • 스위칭 - on: 베이스에 5V(high)가 주어지면 에미터에서 콜렉터로의 전류가 공급됨.
  • 증폭: 베이스에서 나오는 작은 전압이 콜렉터로 갈 때 증폭되어 출력됨.

  • Atmega 128 마이크로 컨트롤러와, NPN 트랜지스터를 사용.
  • LED 4개 구동.
  • PC0에 HIGH가 출력되면 Q1의 스위칭 동작은 ON -> LED 켜짐
  • PC0에 LOW가 출력되면 Q1의 스위칭 동작은 OFF-> LED 꺼짐.

  • IC = 75[mA]: IC는 트랜지스터의 콜렉터 전류를 나타냄. 5V = 3.2V + 0.3V + 20IC로 부터 구함.                                    -> IC = 75. 20은 저항값.(전압 = 전류*저항)
  • VCE(Sat) = 0.3[V]: VCE는 트랜지스터의 포화 콜렉터-에미터 전압을 나타냄. 이는 트랜지스터가 ON의 상태일 때 콜렉터와 에미터 사이의 전압이 최소로 유지되는 값임.
  • LED 전압 강하 3.2[V]: LED가 동작하는 데 필요한 전압.
  • VBE(Sat) = 0.7[v]
  • 20[옴] 양단의 전압강하는 1.5[V]: 5 - 3.2 - 0.3 = 1.5
  • IB = 6[mA]: IB는 트랜지스터의 베이스 전류를 나타냄. (5V - 1.5V -0.7V)/470[옴] = 6.0[mA]
  • (전압강하란 전기 회로에서 전압이 감소하는 것을 나타냄.)

  • H-bridge회로: 네 개의 스위치 or 트랜지스터로 구성된 회로.
  • 단락: 전류 흐름이 가능하게됨.
  • 개방: 전류 사이의 흐름이 차단되어있음.

  • L294D는 모터를 제어하기 위한 H-bridge 드라이버 직적회로 중하나. 왼쪽에 하나, 오른쪽에 하나로 총 2개의 모터를 제어할 수 있음.

  - 코드

#define motor1EnablePin 9
#define motor1_1 2
#define motor1_2 4
void setup() {
    pinMode(motor1_1, OUTPUT);
    pinMode(motor1_2, OUTPUT);
    analogWrite(motor1EnablePin,0);
}
void loop() {
    digitalWrite(motor1_1, HIGH);
    digitalWrite(motor1_2, LOW);
    analogWrite(motor1EnablePin, 255);
    delay(2000);
    analogWrite(motor1EnablePin, 128);
    delay(2000);
    analogWrite(motor1EnablePin, 50);
    delay(2000);
    analogWrite(motor1EnablePin, 0);
    delay(1000);
    
    digitalWrite(motor1_1, LOW);
    digitalWrite(motor1_2, HIGH);
    analogWrite(motor1EnablePin, 255);
    delay(2000);
    analogWrite(motor1EnablePin, 128);
    delay(2000);
    analogWrite(motor1EnablePin, 50);
    delay(2000);
    analogWrite(motor1EnablePin, 0);
    delay(1000);
}

실습6. 초음파 센서

  - 준비물(5): 아두이노 보드, USB cable, 빵판, 초음파 거리센서, 점퍼

  - 함수

  • pulseIn(pin, value): pin-핀번호, value-HIGH또는 LOW.
  • pulseIn(pin, value, timeout): timeout-펄스의 최대 길이 제한. 제한 시간 내에 못하면 0 반환.

  : value가 HIGH이면 전압이 HIGH에서 LOW가 되는 시점까지의 시간.

    즉, HIGH로 상태가 될 때까지 기다린 후,  HIGH가 되면 측정을 시작하는 것임!.

    LOW로 바뀌면 시간 측정 종료.

GPIO에 셋팅

  - 코

const int TriggerPin = 8; //Trig pin - 반사되어 돌아오는 시간 측정을 위한 신호
const int EchoPin = 9; //Echo pin - 초음파 신호 방출 신호
long Duration = 0;

void setup() {
	pinMode(TriggerPin, OUTPUT); 
	pinMode(EchoPin, INPUT); 
	Serial.begin(9600); 	//시리얼 통신 초기화
}

void loop() {
	digitalWrite(TriggerPin, LOW);
	delayMicroseconds(2);
	digitalWrite(TriggerPin, HIGH); // Trigger pin to HIGH
	delayMicroseconds(10); // 10us high
	digitalWrite(TriggerPin, LOW); // Trigger pin to HIGH
	Duration = pulseIn(EchoPin, HIGH); // echo가 high될 때부터 시간 측정 시작.
	// returns the Duration in microseconds
	long Distance_mm = Distance(Duration); // 시간 -> 거리
	Serial.print("Distance = "); // Output to serial
	Serial.print(Distance_mm);
	Serial.println(" mm");
	delay(1000); // Wait to do next measurement
}

long Distance(long time)
{
	// Calculates the Distance in mm
	// ((time)*(Speed of sound))/ toward and backward of object) * 10
	long DistanceCalc; // Calculation variable
	DistanceCalc = ((time / 2.9) / 2); // 시간을 입력받아 mm로 계산
	//DistanceCalc = time / 74 / 2; // Actual calculation in inches		
	return DistanceCalc; // return calculated value
}

  - Echo pin은 초음파가 방출되는 순간부터 HIGH 상태임. 초음파 반사가 감지되면, LOW됨. (맞는지 모르겠음)

 

실습7. Serial LCD

  - 준비물: 16x2 LCD.

  - 코드

void setup()
{
	Serial.begin(9600);	// 시리얼 통신 초기화
	Serial.print("$CLEAR\r\n"); // 화면 지움
	Serial.print("$GO 1 1\r\n"); // 디스플레이 화면 특정 위치로 이동. (1,1)로 이동
	Serial.print("$PRINT Bigfoot \r\n"); // "Bigfoot" 출력
	Serial.print("$GO 2 4\r\n"); // 2행 4열로 이동
	Serial.print("$PRINT Hello World!\r\n"); // "Hello World!" 출력
	delay(1000); 
}
void loop()
{
}

  - 결과

 

실습8. 가변 저항

  - 가변 저항: 저항 값을 조절할 수 있는 부품

  - 전압 분배, 저항 조절의 역할

  - ADC:(Analog-to-Digital Converter) 아날로그신호를 디지털로 변환.

  - ADC의 정밀도(resolution): 0-5V사이를 몇 단계로 나눌건지.

  • 8 bit = 256 단계
  • 10 bits = 1024 단계
  • 16 bits = 65536 단계

  - 코드

int potPin= A2;
int ledPin= 9;
int val= 0;
void setup() {
    pinMode(ledPin, OUTPUT);
    Serial.begin(9600); //시리얼 통신 초기화
}
void loop() {
    val= analogRead(potPin);
    Serial.print("Input Value = "); // Output to serial
    Serial.print(val);
    Serial.println(" unit(5V/1024)");
    val= val/4;
    analogWrite(ledPin, val);
}

  - analogRead()는 포트 입력 전압을 0~1023값으로 변환

  - analogWrite(pin, val): val은 0~255, 출력전압은 val*(5V/255)