LGT8F328P 아두이노 나노 호환 보드

나노와 99%이상 호환이 가능하다는 LGT8F328P보드입니다. 가격은 1/2 – 2/3 수준인데 호환이 잘만 된다면 앞으로 이걸로 구입해서 작업해도 문제가 없겠네요.

가운데 메인칩에 마킹이 없습니다. ATmega328 카피 버전이 아닐까 생각이 됩니다.

아래의 홀텍 USB 칩입니다. 나노 클론에서 많이 쓰는 CH340G칩이 아니네요. 홀텍칩은 따로 USB 드라이버 안 잡아도 윈도우에서 자동으로 잡히네요.

아두이노 IDE에서 셋팅은 다음과 같습니다. Preferences에 아래의 링크를 추가해 주시면 됩니다.

https://raw.githubusercontent.com/dbuezas/lgt8fx/master/package_lgt8fx_index.json

다음에는 실제 프로젝트에서 구동해 보고 결과물을 올려야겠네요. 굳이 돈 더주고 나노를 살 필요는 없을거 같습니다.

또 다른 Arduino Nano 보드들

오른쪽의 보드는 아두이노 나노보드인데 usb 칩이 CH340E 으로 구성되어 있습니다. 보통 많이 들어간 CH340G가 아닙니다. 이 칩은 크리스탈이 칩안에 구성되어 있다고 하네요.

왼쪽 보드는 아두이노 나노인데 메인칩이 ATmega328이 아닌 ATmega168 로 구성되어 있습니다. 2009년에 나온 Arduino Duemilanove에 들어간 칩이라서 메모리 구성이 반이네요.

433MHz RF 무선 송수신 모듈 SYN115/SYN480R

간단한 무선 통신 할때에 쓸 수 있는 장치입니다. 가격은 한세트에 1불정도 하네요. 말도 안되는 가격입니다.

[SYN115]

On-board single-chip ASK transmitter chip SYN115/F115

The module transmitting frequency: 433MHz

Module output power: <10dBm

The module trans rate: <10kbps

The module supply voltage :1.8-3.6V

[SYN480R]

On-board single-chip wireless SYN480R ASK/OOK receiver chip

The module receiving frequency: 433MHz

Module receiver sensitivity: -107dBm

The module transfer rate: 2.5kbps(SWP), 10kbps (FIXED)

The module supply voltage: 3.3-5.5V

스펙은 보면 송신기는 3.3v라서 레벨 쉬프트가 필요합니다.

안테나가 없기 때문에 따로 구입해서 달아야 합니다. 안테나 없으면 제대로 사용하기 힘들겠네요.

송신기 셋업입니다. 3.3V – 5V 레벨쉬프트 달았네요. Voltage divider로 셋팅해도 가능합니다.

수신기는 5V라서 셋팅이 간단합니다.

송신기의 버튼을 누르면 수신기에 있는 LED가 켜지고 꺼지는 방식입니다.

RFID 카드 복사하기

쓰레기 종량제카드를 받았는데 이게 2개씩 밖에 주질 않아서 분실 염려도 있고 해서 복사해서 쓸려고 만들었습니다.

아파트 출입카드도 복사 가능합니다.

RFID 카드 전부가 되는건 아니고 MIFARE 1KB은 됩니다. 최근에 나온 카드 방식은 전혀 안됩니다.

RFID-RC522 로 카드를 읽고 씁니다. 스마트폰 어플로도 가능하다고 하네요.

중요한건 UID changeable 카드가 있어야 됩니다. 보통 카드는 안됩니다.

MFRC522 라이브러리를 설치합니다.

그리고 예제로 들어있는 DumpInfo로 카드를 읽어 UID를 확인 합니다.

예제로 들어있는 ChangeUID에서 아래처럼 데이터를 수정해서 저장 합니다.

그리고 프로그램을 아두이노에 올려서 실행하고 UID 변경 가능한 카드를 가져다 대면 끝납니다.

카드가 간단하게 복제 되네요. 공카드가 몇백원도 안하기 때문에 식구가 많은 경우는 아파트 출입카드도 복사해서 쓰면 될거 같습니다.

2N2222 NPN 트랜지스터 사용하기

Base에는 4.7K 저항이고 LED에는 470저항입니다. 베타값이 100이니깐 이거 계산해서 콜렉터에 걸리는 전압과 전류 계산해서 사용해야 합니다. 

콜렉터 -> 에미터로 흘러가고 콜렉터 전에 Load가 걸리게 만들어 줘야 합니다.

코드는 베이스를 제어해서 LED를 on/off 하게 테스트 용으로 해 보았네요. 

int ledPin = 7;

void setup() {
   pinMode(ledPin, OUTPUT);

}

void loop() {
  digitalWrite(ledPin, HIGH);
  delay(500);
  digitalWrite(ledPin, LOW);
  delay(500);
}

초음파 센서 hc-sr04

거리 측정용 센서로 많이 쓰이는 초음파 센서 hc-sr04 모델입니다. Trigger에서 초음파 내보내고 echo쪽에서 반사되는 초음파로 거리를 측정합니다.

const int trigPin = 9;
const int echoPin = 8;

long duration;
int distance;

void setup() {
  pinMode(trigPin, OUTPUT); 
  pinMode(echoPin, INPUT); 
  Serial.begin(9600); 
}
void loop() {
  // Clears the trigPin
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  
  // Sets the trigPin on HIGH state for 10 micro seconds
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  
  // Reads the echoPin, returns the sound wave travel time in microseconds
  duration = pulseIn(echoPin, HIGH);
  
  // Calculating the distance
  distance = duration * 0.034 / 2;
  
  // Prints the distance on the Serial Monitor
  Serial.print("Distance: ");
  Serial.println(distance);
}

PCF8574로 입출력 확장하기

입출력이 부족할 때 사용하기 좋습니다. 595, 164,164칩 이용하는것 보다 PCF8574 이용하면 I2C 방식이라서 작업이 편합니다. 

어드레스는 A0,A1,A2로 정합니다. 전부 GND에 연결하면 20h이고 0,0,1로 연결하면 24h가 됩니다.

8개의 버튼과 8개의 LED가 있습니다.

하나의 칩이 8개의 input/output이 가능합니다. 8개의 칩 연결이 가능하니 64개의 입출력이 가능하네요.

#include "Arduino.h"
#include "PCF8574.h"

PCF8574 pcf1(0x20);
PCF8574 pcf2(0x24);

void setup() {
  Serial.begin(9600);

  pcf1.pinMode(P0, INPUT);
  pcf1.pinMode(P1, INPUT);
  pcf1.pinMode(P2, INPUT);
  pcf1.pinMode(P3, INPUT);
  pcf1.pinMode(P4, INPUT);
  pcf1.pinMode(P5, INPUT);
  pcf1.pinMode(P6, INPUT);
  pcf1.pinMode(P7, INPUT);

  pcf2.pinMode(P0, OUTPUT);
  pcf2.pinMode(P1, OUTPUT);
  pcf2.pinMode(P2, OUTPUT);
  pcf2.pinMode(P3, OUTPUT);
  pcf2.pinMode(P4, OUTPUT);
  pcf2.pinMode(P5, OUTPUT);
  pcf2.pinMode(P6, OUTPUT);
  pcf2.pinMode(P7, OUTPUT);


  pcf1.begin();
  pcf2.begin();

}

void loop() {

    pcf1.digitalRead(P0)==HIGH? pcf2.digitalWrite(P0, LOW) : pcf2.digitalWrite(P0, HIGH);
    pcf1.digitalRead(P1)==HIGH? pcf2.digitalWrite(P1, LOW) : pcf2.digitalWrite(P1, HIGH);
    pcf1.digitalRead(P2)==HIGH? pcf2.digitalWrite(P2, LOW) : pcf2.digitalWrite(P2, HIGH);
    pcf1.digitalRead(P3)==HIGH? pcf2.digitalWrite(P3, LOW) : pcf2.digitalWrite(P3, HIGH);
    pcf1.digitalRead(P4)==HIGH? pcf2.digitalWrite(P4, LOW) : pcf2.digitalWrite(P4, HIGH);
    pcf1.digitalRead(P5)==HIGH? pcf2.digitalWrite(P5, LOW) : pcf2.digitalWrite(P5, HIGH);
    pcf1.digitalRead(P6)==HIGH? pcf2.digitalWrite(P6, LOW) : pcf2.digitalWrite(P6, HIGH);
    pcf1.digitalRead(P7)==HIGH? pcf2.digitalWrite(P7, LOW) : pcf2.digitalWrite(P7, HIGH);

  delay(100);
}

로터리 엔코더 – Rotary Encoder

한번 돌아가는데 20번 스텝이 있습니다.

코드는 http://bildr.org/2012/08/rotary-encoder-arduino/ 에서 가져왔지만 약간 수정했습니다. 로터리 돌리면 밝기 조정되고 로터리 누르면 밝기가 리셋되면서 red led가 on/off 됩니다.

	
//From bildr article: http://bildr.org/2012/08/rotary-encoder-arduino/

//these pins can not be changed 2/3 are special pins
int encoderPin1 = 2; // interrupt #1
int encoderPin2 = 3; // interrupt #2
int encoderSwitchPin = 4; //push button switch

int ledPin1 = 7;
int ledPin2 = 9;
bool ledStatus = false;
int defaultValue = 140;
int encoderSet = 0;

volatile int lastEncoded = 0;
volatile long encoderValue = 0;

long lastencoderValue = 0;

int lastMSB = 0;
int lastLSB = 0;

void setup() {
  Serial.begin (9600);

  pinMode(encoderPin1, INPUT);
  pinMode(encoderPin2, INPUT);

  pinMode(encoderSwitchPin, INPUT);

  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);

  digitalWrite(encoderPin1, HIGH); //turn pullup resistor on
  digitalWrite(encoderPin2, HIGH); //turn pullup resistor on

  digitalWrite(encoderSwitchPin, HIGH); //turn pullup resistor on

  //call updateEncoder() when any high/low changed seen
  //on interrupt 0 (pin 2), or interrupt 1 (pin 3)
  attachInterrupt(0, updateEncoder, CHANGE);
  attachInterrupt(1, updateEncoder, CHANGE);

}

void loop() {
  //Do stuff here
  if (!digitalRead(encoderSwitchPin)) {
    Serial.println("pushed");
    ledStatus = !ledStatus;
    digitalWrite(ledPin1, ledStatus);
    encoderValue = 0;
  }
  
  Serial.println(encoderValue);
  encoderSet = defaultValue + encoderValue * 2;
  if (encoderSet <0) encoderSet = 0;
  if (encoderSet > 255) encoderSet = 255;
  analogWrite(ledPin2, encoderSet);

  delay(1000); //just here to slow down the output, and show it will work even during a delay
}

void updateEncoder() {
  int MSB = digitalRead(encoderPin1); //MSB = most significant bit
  int LSB = digitalRead(encoderPin2); //LSB = least significant bit

  int encoded = (MSB << 1) | LSB; //converting the 2 pin value to single number 
  int sum = (lastEncoded << 2) | encoded; //adding it to the previous encoded value 
  if(sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011) encoderValue ++; 
  if(sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) encoderValue --; 
  lastEncoded = encoded; //store this value for next time
}

SG90 서보 모터 테스트

제일 구하기 쉬운 마이크로 서보모터인데 기어부분이 플라스틱으로 되어 있어서 테스트 용도 이상으로는 사용하기 힘들거로 보이네요.

문제점: 처음에는 나노 5V에 연결하니깐 움직이지 않아서 모터가 고장난거로 생각했습니다. 모터에서 ‘웅’소리는 나는데 전혀 움직이지 않아서요. 외부 전원으로 연결했더니 작동하네요. 

  • Size: 22×11,5×27 mm
  • Weight: 9 g
  • Power supply: 3 – 6 V
  • Current consumption: 550 mA
  • Logic voltage levels: 3.3 V or 5 V
  • Drive method: PWM
  • PWM range: 500 – 2400 microseconds
  • Speed: 60 degrees in 0.12 s
  • Torque: 1.2 kg / cm (at 4.8V)

모터 스펙을 확인해 보니 550mA가 필요하네요. USB 최대 전원이 500mA이니깐 무리가 있었네요. 마이크로 모터인데 전류량이 엄청나네요. 이건 무조건 외부 전원으로 작동 시키는게 맞습니다.

#include <Servo.h>

int servoPin = 9;
 
Servo servo;  
 
int servoAngle = 0;   // servo position in degrees
 
void setup()
{
  Serial.begin(9600);  
  servo.attach(servoPin);
  servo.write(90);
}

void loop()
{
   if(Serial.available() > 0){
    int servoValue = Serial.parseInt();
    servo.write(servoValue);
   }
}