아두이노 제반 사항

  • 문서 > Arduino > libraries
  • 내 PC(내컴퓨터) > 로컬 디스크C (C드라이브) > Program Files(x86) >Arduino > libraries

  • 아두이노의 각 핀은 20mA까지 전원을 공급가능
  • LED 전구 1개의 소비전류가 20mA
  • LED 한개를 위한 저항은 220옴
  • 풀업 저항을 10k옴

  • VIN 핀은 1A,
  • 5V 핀도 1A (5V 레귤레이터인 NCP1117ST50T3G의 사양에 따른 것이지만 실제로는 이보다 한계치가 작을 수 있습니다),
  • 3V3 핀은 150mA (3.3V 레귤레이터인 LP2985-33DBVR의 사양에 따른 것이지만 역시 실제 한계치는 작을 수 있습니다)

  • MOSFET: 금속 산화막 반도체 전계효과 트랜지스터 (Metal-oxide-semiconeuctor field-effect transistor)
  • 게이트(Gate)에 전기가 흐르면 드레인(Drain)에서 소스(Source) 핀으로 전기가 흐른다.
  • 게이트 핀은 금속 산화막 위의 나머지 부분과 절연되어 있기때문에 아두이노에서 모스펫으로 흘러들어가는 전류가 없다.
  • 모스펫은 큰 부하를 빠른 주파수로 껏다 켜기에 이상적이다.
  • IRF520 - 모스펫 모델명

  • 소프트웨어 시리얼: https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=roboholic84&logNo=220550737629

작은따옴표와 큰따옴표는 의미가 다름

  • char a;
  • if( a == “A”) 는 컴파일 에러
  • if( a == ‘A’) 는 정상작동;

  • 작은 따옴표는 단일문자
  • 큰 따옴표는 문장을 표시하는것 같다

명령어

shift out

  • shiftOut(dataPin, clockPin, bitOrder, value)
  • bitOrder : 바이트순서, 낮은비트가 먼저오는지 높은 비트가 먼저오는지

pulse in

  • unsigned long pulseIn(pin, value)
  • 디지털 입력핀으로 들어오는 펄스의 길이를 측정
  • 적외선 센서나 가속도 센서
  • time = pulsein(7,HIGH) //7번핀에 얼마나 오랬동안 HIGH인지

constrain (value, min, max)

  • value 값을 min과 max사이로 제약하여 리턴

map (value, fromLow, fromHigh, toLow, toHigh)


randomSeed

  • randomSeed(analogRead(5)); //5번핀의 노이즈값을 랜덤의 seed로 이용하기
  • random(max); //이경우 min은 0
  • random(min,max);

Serial

  • Serial.print(value, encoding)
  • encoding : DEC, HEX, OCT, BIN, BYTE : 10진수, 16진수, 8진수, 2진수, 바이트
  • Serial.println(value, encoding) : 캐리지 리턴과 줄마꿈(/r/n)이 추가됨
  • Serial.available() : 시리얼 포트에 읽지 않은 바이트가 얼마나 있는지 확인
  • Serial.read() : 시리얼 포트에서 바이트 읽어오기
  • Serial.flush() : 시리얼 버퍼를 내리기 (아두이노가 처리할 수 있는 데이터량 보다 많은량의 시리얼이 들어올때 처리하는 방법)

  • bitRead(B00100111,0); //0번주소의 비트 읽기
  • B00100111식으로 2진수값 입력 가능

7segment

#define A 6
#define B 7
#define C 8
#define D 9
#define E 10
#define F 12
#define G 11
#define SW1 3
#define SW0 2

int segments[10] = {
  B1111110, //0
  B0110000, //1
  B1101101, //2
  B1111001, //3
  B0110011, //4
  B1011011, //5
  B1011111, //6
  B1110000, //7
  B1111111, //8
  B1111011, //9
};
void setup()
{
  pinMode(A, OUTPUT);
  pinMode(B, OUTPUT);
  pinMode(C, OUTPUT);
  pinMode(D, OUTPUT);
  pinMode(E, OUTPUT);
  pinMode(F, OUTPUT);
  pinMode(G, OUTPUT);
  pinMode(SW1, INPUT);
  pinMode(SW0, INPUT);
}

void loop()
{
  for(int i=0; i<10; i++){
    int value = segments[i];
    digitalWrite(A, bitRead(value,6)); 
    digitalWrite(B, bitRead(value,5)); 
    digitalWrite(C, bitRead(value,4)); 
    digitalWrite(D, bitRead(value,3));  
    digitalWrite(E, bitRead(value,2));  
    digitalWrite(F, bitRead(value,1));  
    digitalWrite(G, bitRead(value,0));
    delay(200);
  }
  
  int value  = digitalRead(9);
  digitalWrite(LED_BUILTIN, value);
  delay(10);
  Serial.println("test");
}

interrupt

  • 자료 : https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=yuyyulee&logNo=220310875023
  • attachInterrupt(intNo, ISR, mode)
  • intNo : 인터럽트 번호
  • ISP : 인터럽트 발생시 호출될 함수 이름
  • mode : 인터럽스 모드 선택, Falling, Rising, Change, Low

interript pin번호

  • 각 인터럽트번호(0~5)에 대한 핀번호
  • 메가 : 2,3,21,20,19,18
  • 우노 : 2,3

mode

  • FALLING = HIGH -> LOW
  • RISING = LOW -> HIGH
  • CHANGE = FALLING + RISING
  • LOW = LOW인 경우 발생, LOW인 동안 반복 호출

  • FALLING,CHANGE -> LOW -> CHANGE,RISING
  • detachInterrupt(intNo) 인터럽트 제거

goto 구문

goto label;

label:
   //statements

아두이노 데미지


LCD 스크린 한계

예를 들어 님이 사용하는 0.96인치 LCD가 그래픽 LCD이고 해상도가 128 x 64 라고 가정합시다. 그럼 LCD 1개에 들어가는 data값은 128 x 8byte = 1024Byte가 필요합니다 .이것을 8개사용한다면 총 8KByte가 들어갑니다 . 아두이노 우노의 경우 내부 메모리가 32kByte 이므로 메모리가 부족하지는 않을것입니다. 다만 문제는 8KByte를 보내는 통신에서 꽤 시간이 걸릴것 같지만 동영상이 아닌 숫자정도라면 가능하리라 봅니다. 그보다 LCD와 통신은 어떤 포멧으로 할지도 고려해 보세요. I2C 통신을 한다면 LCD의 device address가 모두 달라야 합니다 .(이말이 무슨 말이지 모른다면 I2C device address를 검색해 보세요) SPI통신으로 제어한다면 Clock와 data는 같이 공용으로 사용해도 되고, 대신에 CE은 8개를 각각 연결해줘야 합니다 . 참고하세요.


아두이노 와이파이 기지국 (서버역할)

  • https://postpop.tistory.com/23

입출력핀 확장

  • 출력확장 : 74HC595
  • 입력확장 : 74HC165, 74HC597