안녕하세요~


이번시간에는 아두이노를 통한 기초적인 제어를 배워보도록 하겠습니다.



#1 아날로그와 디지털 신호


아두이노는 크게 디지털 신호의 입력과 출력, 아날로그 신호의 입력이 가능하게 고안이 되었습니다.


디지털 신호는 흔이 0 아니면 1의 값 (0=False, 1=True)을 갖는 이진 신호 또는 논리 신호라고 합니다.

굳이 전압으로 따지자면, 0 일때는 0V의 전압이, 1일때는 5V의 전압이 출력된다고 볼 수 있죠!


그럼 아날로그 신호는 무슨 신호일까요?


디지털 신호가 0V와 5V 밖에 없다고 한다면, 아날로그 신호는 0V와 5V 사이의 그 어떤 값도 가능한 신호를 아날로그 신호라 할 수 있습니다.

즉, 0V와 5V 사이의 어떤 연속적인 값이라 보시면 됩니다.



주로 디지털 신호는 통신이나 On/Off 제어를 위해 많이 쓰이는 신호이고, 아날로그 신호는 센서의 값을 받아들일 때 많이 쓰이는 신호입니다.


그럼 디지털 신호를 어떻게 쓰는지 살펴봅시다.



#2 발광다이오드 (LED)


디지털 신호를 통해 제어하는 하드웨어중 대표적인것이 바로 발광다이오드(Light Emitting Diode, LED) 입니다. 




즉, '다이오드' 중에서 빛을 발하는 다이오드를 말합니다. 다이오드는 일정한 방향으로만 전류가 흘러가게 해주는 전자부품으로, 만약 LED의 +,-가 반대로 연결된다면 끊어진 회로와 같게 되는겁니다. 


LED의 극성을 찾을때 흔히들 다리 길이를 보고 찾으시는데, 긴쪽이 +, 짧은쪽이 -입니다. 하지만 다리를 자르고나면 극성은 어떻게 구분할까요~?


LED안을 자세히 보면 위의 그림처럼 내부 쇠막대기가 긴쪽이 있고, 짧은쪽이 있답니다. 내부 쇠막대기가 짧은쪽이 +, 긴쪽이 - 라고 생각하시면, 다리를 잘라도 극성을 구분할 수 있겠죠?



#3 LED 회로 구성


그렇다면 LED를 이용해서 회로를 구성해봅시다.


기본적인 부품으로는 전원이 될 건전지와 LED, On/Off를 가능하게 할 스위치, 그리고 LED에 걸리는 전압을 낮춰주는 저항 이 필요합니다.

저항은 330ohm 내지 1Kohm 정도 사용하면 됩니다.



위 사진처럼 회로를 꾸미고 나면 스위치를 켜고 끄는거에 따라 LED의 불빛이 켜졌다 꺼졌다 할겁니다~



#4 아두이노를 이용한 LED 제어


이번에는 아두이노를 이용해서 LED를 On/Off 해봅시다.

회로에서 전원부분과 스위치를 디지털 아웃풋으로 대체하면 회로는 완성됩니다.




자 그럼 단순하게 1초 간격으로 깜빡이게 만들어볼까요?

불을 켜려면 digital pin에 On 이라는 신호를 넣어주면 됩니다.

아두이노에서 디지털 아웃풋을 주려면 

digitalWrite(핀 넘버, 값(HIGH or LOW)) 을 넣어주면 되죠.


그럼 켤때는 

digitalWrite(13,HIGH);


끌때는

digitalWrite(13,LOW);


를 입력해주면 됩니다. 


그리고 1초라는 시간을 줘야하기때문에,


중간에 delay(1000) 를 넣어 1000ms = 1s 동안 아웃풋이 유지되게 만드는겁니다.



알고리즘을 도식화하면 위와 같이 나타내지고, 코드는 


Arduino IDE -> 파일 -> 예제 -> Basics -> Blink 에 있습니다.



// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);                       // wait for a second
}


위 코드를 입력하면 LED가 1초 간격으로 깜빡이는걸 확인 할 수 있죠!


이렇게 간단하게 디지털 신호의 출력만으로 특정 하드웨어의 전원을 껐다 켰다 할 수 있답니다.

다음시간에는 이 LED의 밝기를 어떻게 조절하는지에 대해 살펴볼게요~



이번시간에는 Windows 기반 노트북의 배터리 사이클을 측정해보겠습니다.


배터리 사이클은 노트북에 설치된 배터리가 몇회 방전되고 충전되었는지를 나타내주는 수치랍니다.


이러한 수치는 배터리의 수명과 직결되는데, 주로 사이클 수가 낮으면 건강한 배터리 라고 볼수 있습니다.


다만 사이클수만 볼게 아니라, 설계된 배터리의 용량과 실제 충전/방전 용량을 잘 살펴봐야겠지요ㅎㅎ


예전에는 충전기를 꽂아두면 배터리 수명이 빨리 떨어진다고 했지만,


지금은 대부분 리튬폴리머 배터리 재질이고, 회로 구성도 잘 되어있어


오히려 꽂아두면 배터리 사이클 수를 줄일 수 있다고도 합니다.


(잘은 못믿겠지만 체감상으로도 꽂아두는게 좋은듯...?)



자 그럼 확인을 해봅시다.


먼저 윈도우에서


시작 -> 실행 -> cmd


를 입력하셔서 명령 프롬트 창을 띄웁니다.


그 다음에


powercfg /batteryreport


를 입력하시고 앤터를 치세요.



그럼 아래와 같이 지정된 폴더

(여기서는 C:\Users\fkzld\battery-report.html)


에 html 파일로 저장이 된답니다.




저장된 파일을 열어보시면...!!


짜잔~



여기서 배터리 디자인 용량과 실제 충전 용량, 배터리 사이클, 배터리 이름 등등


엄청 많은 정보들을 볼 수 있답니다.



심지어 몇분 단위의 충전 / 방정 로그까지 나와서 체계적으로 관리를 할 수 있을 듯 합니다ㅎㅎ


그리고 배터리 수명을 관리해주는 프로그램인


'Battery Bar'


를 설치하시면 예상 충전시간과 방전시간이 나옵니다~


Image result for battery bar


계속 사용하면 할수록 통계를 통해 시간의 정확도가 올라간다고 하니,


꾸준히 사용해보시면 좋을듯 합니다!

'잡담 > Etc.' 카테고리의 다른 글

웨딩반지 구매 후기 - 종로 나르샤쥬얼리  (0) 2022.12.23
서피스 프로 펜 촉 제작  (2) 2018.05.21
사이트맵 제출용  (0) 2017.10.24
서피스 프로4 CPU 문제 해결  (0) 2017.04.06


안녕하세요~


이번시간에는 SD카드를 이용한 데이터 로깅 방법에 대해 알아보겠습니다.


지난 시간에서 프로세싱을 통해 아두이노의 데이터를 가시화 한것 처럼,

아두이노는 '데이터의 수집' 기능을 주로 수행한답니다.


하지만 이러한 경우에는 PC가 필수적으로 함께 있어야만

데이터를 저장 및 확인할수가 있죠.


만약에 PC가 없다면 어떻게 데이터를 저장할 수 있을까요?


바로 SD카드를 이용해서 아두이노가 수집한 데이터를

SD카드에 저장해두는 것입니다.


그럼 나중에 장치를 구동한 후, 데이터가 저장된 SD카드만 있으면

아두이노에서 측정된 데이터들을 PC에서 신호처리를 할 수 있겠죠ㅋㅋ


그럼 한번 살펴봅시다.





#1 준비물




SD 카드, SD 카드 소켓

(소켓은 리더기가 아니라 우측에 보이는 모듈입니다)



아두이노

(여기서는 Bluno Beetle을 사용했습니다)





#2 SD카드 소켓 연결



자 이제 물품을 준비했다면 아두이노와 SD카드를 연결시켜 보겠습니다~


먼저 SD카드에 데이터를 저장하기위해서는

'SPI통신'을 통해 데이터를 저장한답니다.


SPI통신은 센서모듈이나, 제어모듈 등에 흔히 사용되는 통신으로,

여기를 참고하시면 될거에요~ 


자 그럼 핀들을 각각 연결해 볼까요?


먼저 Bluno Beetle 에는 MISO, MOSI, SCK,  등의 SPI 통신 핀들이

기판에 나타나있지 않습니다.


다만 뒤집어보면 작은 박스부분에 모여있지요....


아두이노의 경우에는 10~13번 디지털 핀들이 SPI통신과 연관된 핀이랍니다.

구글에 핀배치를 검색하시고 배선하세요~!  



자 그럼 연결을 해봅시다.




아무래도 연결하는곳들이 핀헤더가 없이 기판이다보니

납땜을 하는수 밖에 없네요ㅠ


여기서 SPI 통신 외적으로 하나를 더 연결하셔야 할 부분이 있는데,

바로 Chip Select Pin 인 CS 핀 입니다.


저는 CS핀을 디지털 4번핀에 연결했어요~

디지털 핀 어디다 연결하셔도 상관없습니다ㅋㅋ





#3 배선 완료후 모듈화




자 이제 배선도 완료됐으니,


전원선도 연결하고 코딩도 넣어볼까요~?



우선 전원은 사실 5V에 구동되는 아두이노라 하더라도 

리튬 폴리머(Li-po) 베터리 1cell 로도 충분히 구동은 된답니다ㅋㅋㅋ


물론 1Cell 이면 3.7V 밖에 안되긴 하지만, 아주 장시간을 구동시킬게 아니면 상관없답니다~

다만 아날로그 인풋의 경우에는 조금 영향이 있기때문에, 

그런 경우에는 2Cell 로 써서 7.4V 전원을 Vin에다가 넣어주시면 됩니다ㅋㅋ


저는 3.7V 를 Vin에 바로 연결해서 사용했습니다.



짜잔 아무런 이상없이 잘 돌아간답니다ㅋㅋㅋ


그럼 코딩을 해볼까요~




#include <SPI.h>

#include <SD.h>

#include "Timer.h"


const uint8_t CS = 4;


const unsigned long PERIOD = 100;    //one second

Timer t;                               //instantiate the timer object


File dataFile;

int numFile;

String fileName;


int data[5] = {0,0,0,0,0};

int data2[5] = {0,0,0,0,0};

int count = 0;


void setup() {


  pinMode(LED_BUILTIN,OUTPUT);

  // put your setup code here, to run once:

  t.every(PERIOD, recording);

  if (!SD.begin(CS)) {

    return;

  }


  dataFile = SD.open("/");

  numFile = printDirectory(dataFile);


  fileName = String(numFile) + ".txt";


  Serial.begin(9600);

  Serial.println(fileName);


  dataFile = SD.open(fileName, FILE_WRITE);

  dataFile.println("Start!");

  dataFile.close();

}


void loop() {

  // put your main code here, to run repeatedly:

  t.update();


}


void recording(){

  int val = analogRead(A0);

  count = count%5;

  

  dataFile = SD.open(fileName, FILE_WRITE);


  data[count] = val;

  val = (data[0]+data[1]+data[2]+data[3]+data[4])/5;

  

  dataFile.print(val);

  dataFile.print("\t");


  Serial.print(val);

  Serial.print("\t");


  val = analogRead(A3);

  data2[count] = val;

  val = (data2[0]+data2[1]+data2[2]+data2[3]+data2[4])/5;

  


  dataFile.println(val);

  Serial.println(val);


  dataFile.close();  

  count++;

  return 0;

}



int printDirectory(File dir) {

  int fileNum = 0;

  while (true) {

    File entry =  dir.openNextFile();

    if (! entry) {

      return fileNum;

    }else{

      fileNum++;

    }

    entry.close();

  }

}



위 코드를 실행하기위해서는 Timer 라이브러리가 있어야하는데,

여기 에서 찾으시면 되요~!


좀 복잡한 코드이긴 한데, 간단히 설명하자면 아날로그 신호를 SD카드에 로깅하는 코드입니다.


앞서 언급드렸다싶이 CS핀은 아무 디지털핀에 연결하셔도 됩니다만, 

맨 위에줄에서 보이는것 처럼


const uint8_t CS = 핀 번호;


를 입력해주셔야 합니다!!


그리고 SD카드가 소켓에 장착되지 않으면 로깅이 안되고,

장착이 되었다면, 내부에 있는 파일을 스캔한 후,


"존재하는 파일갯수+1.txt"


라는 이름으로 데이터가 텍스트파일로 로깅됩니다~


PERIOD는 몇ms간격으로 데이터를 로깅하는지 세팅하는 값이랍니다.


지금은 100ms간격으로 데이터를 받아오고 있지요.


그리고 데이터자체가 워낙에 노이즈가 많아서,

5번 측정한 값의 평균을 저장하도록 만들었어요~



이정도 코드면 조금만 수정하시면

원하시는 프로젝트에 바로 사용할 수 있을거라 생각이 됩니다^^


이상!

+ Recent posts