본문 바로가기

programming

아두이노 센서 사용 코드 예시

 

목차

 

저항

PWM

LED 센서 실습

애노드 캐소드 실습

택트 스위치 실습

피에조 부조 실습

조도 센서 실습

적외선 센서 실습

LCD 센서 실습

,습도 센서 및 LCD 센서 실습

초음파 센서 실습

서보 모터 실습

스텝 모터 실습

DC 모터 실습

블루투스 모듈 실습

WIFI 모듈 실습 (STA 모드)

WIFI 모듈 실습 (AP 모드)

저항

 

저항을 사용할 때 띠의 색으로 저항의 크기를 표시한다. 색을 보고 알맞은 저항을 사용하면 된다. 저항이 크면 클수록 흐르는 전류의 양은 줄어든다.

 

 

Pwm 신호

Pwm 신호란 pulse width modulation 의 줄임말로, 디지털 신호로 아날로그 신호를 만드는 기법이다.

신호에서 일정 시간동안 01을 반복한다. 이중 1이였던 시간을 Duty Cycle 이라한다. Duty Cycle 이 크면 클수록 더 높은 출력값을 가지게 되고, Duty Cycle 값이 작으면 더 작은 출력 값을 가지게 된다. 이러한 방식으로 디지털 출력이지만 아날로그 신호처럼 쓰일 수 있다.

 

 

 

LED 센서 실습

#define LED_PIN 2

#define HIGH_TIME 1000 //msec

#define LOW_TIME 1000 //msec

void setup()

{

pinMode(LED_PIN, OUTPUT);

}

void loop()

{

digitalWrite(LED_PIN, HIGH);

delay(HIGH_TIME);

digitalWrite(LED_PIN, LOW);

delay(LOW_TIME);

}

code

 

Output picture

330Ω light on

330Ω light off

10kΩ light on

10kΩ light off

LED 센서에 불을 켜고 끄는 것을 해보았다. LED 센서는 전류가 많이 흐를수록 더 강한 빛을 방출 한다. 같은 프로그램을 아두이노에서 사용 하였지만 저항의 값에 따라서 LED 센서의 불 세기가 달라졌다. 저항이 작으면 작을수록 전류가 커짐으로 인해 더 강한 빛이 나온다. 저항의 크기가 크면 흐르는 전류의 양이 작아지므로 빛의 세기가 약해진다. 이를 이용하여 특정한 상태일 때 불이 켜짐과 꺼짐을 통해 output 으로 활용이 가능하다.

 

 

 

애노드 캐소드 실습

#define LED_R_PIN 11

#define LED_G_PIN 10

#define LED_B_PIN 9

#define TIME 500 //msec

void setup()

{

pinMode(LED_R_PIN, OUTPUT);

pinMode(LED_G_PIN, OUTPUT);

pinMode(LED_B_PIN, OUTPUT);

}

void loop()

{

digitalWrite(LED_R_PIN, LOW);

digitalWrite(LED_G_PIN, HIGH);

digitalWrite(LED_B_PIN, HIGH);

delay(TIME);

digitalWrite(LED_R_PIN, HIGH);

digitalWrite(LED_G_PIN, LOW);

digitalWrite(LED_B_PIN, HIGH);

delay(TIME);

digitalWrite(LED_R_PIN, HIGH);

digitalWrite(LED_G_PIN, HIGH);

digitalWrite(LED_B_PIN, LOW);

delay(TIME);

digitalWrite(LED_R_PIN, LOW);

digitalWrite(LED_G_PIN, LOW);

digitalWrite(LED_B_PIN, LOW);

delay(TIME);

digitalWrite(LED_R_PIN, HIGH);

digitalWrite(LED_G_PIN, HIGH);

digitalWrite(LED_B_PIN, HIGH);

delay(TIME);

}

code

 

Output picture

Light off

Red

Green

Blue

White

 

애노드 캐소드를 사용하여 기존의 LED 센서에 비해서 다양한 색을 낼 수가 있었다. 위의 실습에서는 10kΩ을 사용하여서 실습하였지만 만약 저항 값이 더 낮은 저항을 사용했다면 더 밝은 출력을 얻을 수 있었을 것이다. 기존의 LED 센서가 on/off 2가지 output을 낼 수 있었다면, 애노드 캐소드는 white/red/green/blue/off 5가지 output이 가능하다. 하나의 센서로 다양한 output 을 낼 수 있다는 장점이 있다.

 

 

 

택트 스위치 실습

#define LED_PIN 2

#define BUTTON_PIN 3

void setup()

{

pinMode(LED_PIN, OUTPUT);

pinMode(BUTTON_PIN, INPUT);

}

void loop()

{

if(digitalRead(BUTTON_PIN) == HIGH)

digitalWrite(LED_PIN, HIGH);

else

digitalWrite(LED_PIN, LOW);

}

code

 

Output picture

Switch on

Switch off

 

스위치를 사용하여 버튼을 누를 때와 버튼을 누르지 않을 때 두가지 input 에 따라서 LED 센서의 빛을 켜고 끄는 실습을 해 보았다. 또한 이것을 응용하여 누를때와 눌렀다가 누르지 않을 때 2가지 순간의 edge 를 인식하여 input 을 줄 수도 있다. 스위치의 input 을 사용하여 mode 변경등 다양한 곳에서 사용이 가능하다.

 

 

 

 

 

슬라이드 스위치 실습        

#define LED_PIN 2

#define BUTTON_PIN 3

void setup()

{

pinMode(LED_PIN, OUTPUT);

pinMode(BUTTON_PIN, INPUT);

}

void loop()

{

int button_state = digitalRead(BUTTON_PIN);

if (button_state == HIGH) {

digitalWrite(LED_PIN, HIGH);

}

else {

digitalWrite(LED_PIN, LOW);

}

}

<Switch off>

<Switch on>

code

Switch on and off

 

스위치 사용에 따라서 LED 신호를 줄 수 있다. 이를 통해 스위치의 값을 input 으로 다양한 곳에서 활용이 가능하다. 어떤 특정한 장치 혹은 특정한 함수를 실행하는 input 으로 사용이 가능하다.

 

 

 

피에조 부조 실습

#define BUZZER_PIN 11

void setup() {

pinMode(BUZZER_PIN, OUTPUT);

}

void loop() {

//옥타브 = 4

tone(BUZZER_PIN, 262); //

delay(500);

tone(BUZZER_PIN, 277); // #

delay(500);

tone(BUZZER_PIN, 294); //

delay(500);

tone(BUZZER_PIN, 311); //#

delay(500);

tone(BUZZER_PIN, 330); //

delay(500);

tone(BUZZER_PIN, 349); //

delay(500);

tone(BUZZER_PIN, 370); // #

delay(500);

tone(BUZZER_PIN, 392); //

delay(500);

tone(BUZZER_PIN, 415); // #

delay(500);

tone(BUZZER_PIN, 440); //

delay(500);

tone(BUZZER_PIN, 466); // #

delay(500);

tone(BUZZER_PIN, 494); //

delay(500);

tone(BUZZER_PIN, 523); //(옥타브5)

delay(500);

}

code

o

Output picture

피에조 부저를 사용하여 원하는 음을 소리내 보았다. 부저 센서를 output 으로 사용하여, 특정한 상황에서 소리로 알려줄 수 있다. 음이나 리듬을 정하여 다양한 소리를 통해 현재 어떠한 상황인지 알려 주는 용도로 사용이 가능하다고 생각했다.

 

 

 

조도 센서 실습

#define CDS_PIN A0

void setup() {

Serial.begin(9600);

pinMode(CDS_PIN, INPUT);

}

void loop() {

int value = analogRead(CDS_PIN);

Serial.println(value);

delay(100);

}

code

 

 Output plot

Experimental setup

 

output plot에서 보다시피 어두우면 값이 커지고 밝으면 값이 작아진다. 가장 밝은 값이 0  어두운 값이 1024정도로 되어 있다. 조도 센서를 input 으로 사용하여 다양한 곳에서 활용이 가능하다. 이를 이용하여 밤과 낮에 다르게 작동하는 스위치 등에서 사용이 가능하다.

 

 

 

적외선 센서 실습

#define IR_PIN A0

void setup() {

Serial.begin(9600);

pinMode(IR_PIN, INPUT);

}

void loop() {

int value = analogRead(IR_PIN);

Serial.println(value);

delay(100);

}

code

Floating output

Experimental setup

 

적외선 센서를 사용하여 output plot 해 보았다. 멀리 물체가 있으면 값이 커지고 가까이 있으면 값이 작아졌다. 센서에 초록불이 2가지 있다. 하나는 연결 시 들어오는 불이고 나머지 하나는 가까이 물체가 있으면 불이 들어온다. 코드로 값을 수치적으로 보여주는 것도 있지만 센서 자체에서 불빛이 알려줘서 직관적인 부분이 있었다. 하지만 생각보다 측정하는 거리가 짧고 단거리에서만 측정이 가능하기 때문에 단거리에서 미세한 변화를 측정하기에 적합한 센서라고 생각했다. 적외선 센서를 input 으로 사용하여 다양한 곳에서도 활용할 수가 있다.

 

LCD 센서 실습

 

#include <Wire.h>

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2);

void setup()

{

lcd.init();

lcd.backlight();

lcd.setCursor(0, 0);

lcd.print("Capstone Design");

lcd.setCursor(0, 1);

lcd.print("2020");

}

void loop()

{

}

Code

Output on LCD

LCD 모듈을 사용하여 원하는 문구를 LCD 화면에 출력 되도록 실습 해보았다. LCD 모듈을 이용하여 특정한 상황일 때 output LCD 모듈을 이용한다면, 직관적으로 알아보기 쉽게 사용이 가능하다.

 

 

 

 

 

 

 

온습도 센서 및 LCD 센서 실습

#include <DHT.h>

#include <Wire.h>

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);

#define DHTPIN 4

#define DHTTYPE DHT11 // DHT 11

DHT dht(DHTPIN, DHTTYPE);

void setup() {

  Serial.begin(9600);

  dht.begin();

  lcd.init();

  lcd.backlight();

}

void loop() {

  float h = dht.readHumidity();

  float t = dht.readTemperature();

  lcd.setCursor(0, 0);

  lcd.print("Humidity: ");

  lcd.print(h);

  lcd.print("%");

  lcd.setCursor(0, 1);

  lcd.print("Temperature:");

  lcd.print(t);

  lcd.println("°C ");

  delay(1000);

}

Code

 

온습도 센서를 사용하여 값을 읽어 와서 LCD 화면에다가 출력을 해 보았다. 아마도 센서가 조금 부서져 있어서 값을 잘 읽어오지를 못하여 값이 nan 이라고 뜨는것으로 추정 된다. 비록 값을 잘 받아오지는 못하였지만 input 센서로 온습도 센서를 사용하고 output 으로 LCD 센서를 사용하여 값을 출력하는 과정을 통해 여러 센서를 통한 input output 을 경험해 보았다. 이를 이용하여 온습도가 아닌 다른센서로 input 을 받고 모터, LCD 와 같은 다른 센서에서 output 을 낼 수 있다.

 

 

 

 

 

 

 

 

 

 

초음파 센서 실습

#define TRIG_PIN 7

#define ECHO_PIN 6

void setup() {

Serial.begin(9600);

pinMode(TRIG_PIN, OUTPUT);

pinMode(ECHO_PIN, INPUT);

}

void loop() {

digitalWrite(TRIG_PIN, LOW);

delayMicroseconds(4);

digitalWrite(TRIG_PIN, HIGH);

delayMicroseconds(20);

digitalWrite(TRIG_PIN, LOW);

long duration = pulseIn(ECHO_PIN, HIGH, 5000);

float distance = duration / 58.0;

Serial.println(distance);

delay(10);

}

code

Ploting the output

Experimental setup

 

Ploting 결과처럼 가까울 때부터 먼 거리까지 실습을 해보았다. 기존에 사용했던 적외선 보다 먼거리까지 측정이 된다는 장점이 있지만 갑자기 거리가 멀어지거나 가까워질 때나 정확한 거리 측정을 잘 하지 못하고 0.0 으로 거리가 출력되는 경우가 있었다. 이러한 문제점이 있어서 정밀한 측정을 할 때는 사용을 지양하는 것이 적합할 것 같다고 생각했다. 초음파 센서를 input 으로 사용한다면 멀리 있는 물체가 가까이 올 때 와 같은 상황에서 사용 할 수 있다.

 

 

 

서보 모터 실습

#include <Servo.h>

Servo servo;

#define SERVO_PIN 9

void setup() {

Serial.begin(9600);

servo.attach(SERVO_PIN);

}

void loop() {

if (Serial.available() > 0) {

String packet;

packet = Serial.readStringUntil('\n');

if (packet != 0) {

int temp;

temp = packet.toInt();

servo.write(temp);

Serial.print("SERVO : ");

Serial.println(temp);

}

}

}

code

Input value

 

Output on servo motor

When input = 0

When input = 90

When input = 180

 

Servo motor 를 사용하여 실습을 해 보았습니다. Servo motor 란 단순히 하나의 모터만으로 구성되어 있는게 아니라 모터를 사용하여 적절한 구동 시스템을 연계하고 위치, 속도를 명령으로 제어 및 추종시킨 경우를 서보 모터라고 한다.

이번 실습에서는 각도를 input 으로 하여 실제 output 에서 원하는 각도로 이동하는 것을 확인해 보았습니다.

서보 모터를 사용하여 원하는 각도로 회전할 수 있어서 정교한 control 을 할 때 유용하게 사용이 가능하다. 전원을 공급하면 한쪽 방향으로 지속적으로 회전하는게 아니라 일정각도 까지만 회전하는 특징을 다양한 곳에 적용할 수 있다.

 

 

 

 

 

 

 

스텝 모터 실습

#include <Stepper.h>

#define IN1 11

#define IN2 10

#define IN3 9

#define IN4 8

const int steps = 2048;

Stepper myStepper(steps,IN4,IN2,IN3,IN1);

void setup() {

Serial.begin(9600);

myStepper.setSpeed(10);

}

void loop() {

if (Serial.available() > 0) {

String packet;

packet = Serial.readStringUntil('\n');

if (packet != 0) {

int temp;

temp = packet.toInt();

temp = (2048.0 / 360.0) * temp;

Serial.print("steeper : ");

Serial.println(temp);

myStepper.step(temp);

}

}

}

code

Output picture

 

 

 

스텝 모터는 펄스 모양의 전압에 의해 일정 각도 회전하는 전동기이다. 회전 각도는 입력 펄스의 신호의 주파수에 비례한다. 일반적으로 쓰는 DC 모터와 달리, 전자석을 사용하여 극을 바꾸면서 자력의 인력과 척력을 이용하여 모터를 회전한다. 이러한 원리를 이용하여 스텝 모터를 돌려 보았다.

DC 모터와 비슷한점이 많았지만 마찰이 적다는 점이 가장큰 장점인 것 같다. 따라서 DC 모터에 비해서 지속적인 회전이 필요한 곳에서 사용하기에 적합하다는 생각을 하였다.

 

 

 

 

 

 

 

 

 

DC 모터 실습

#define ENABLE_PIN 9

#define INPUT1_PIN 10

#define INPUT2_PIN 11

void setup() {

pinMode(ENABLE_PIN, OUTPUT);

pinMode(INPUT1_PIN, OUTPUT);

pinMode(INPUT2_PIN, OUTPUT);

Serial.begin(9600);

}

void loop() {

if (Serial.available() > 0) {

String packet;

packet = Serial.readStringUntil('\n');

if (packet != 0) {

int temp;

temp = packet.toInt();

Serial.print("state : ");

Serial.println(temp);

if(temp == 1){

analogWrite(ENABLE_PIN, 200);

digitalWrite(INPUT1_PIN, HIGH);

digitalWrite(INPUT2_PIN, LOW);

}

else if(temp == -1){

analogWrite(ENABLE_PIN, 200);

digitalWrite(INPUT1_PIN, LOW);

digitalWrite(INPUT2_PIN, HIGH);

}

else{

analogWrite(ENABLE_PIN, 0);

digitalWrite(INPUT1_PIN, LOW);

digitalWrite(INPUT2_PIN, LOW);

}

}

}

}

Code

Experimental setup

DC 모터란, 조정자로 영구자석을 사용하고, 회전자로 코일을 사용하여 구성한 것이다. 전기자에 흐르는 전류의 방향을 전환함으로 써 자력의 반발, 흡인력으로 회전력을 생성시키는 모터인다. 일반적으로 많이 쓰이는 모터이고 제어가 쉽다는 장점이 있다. 하지만 brush와 정류자에 의한 접점으로 인해 마찰이 있으며 이로 인한 노이즈와 수명 단축이 있다.

DC 모터를 아두이노로 제어함을 통해서 서보 모터와는 달리 필요할 때 원하는 각도 까지 회전하는게 아니라 지속적으로 회전을 가능하게 하는 곳에서 사용하기에 적합하다는 생각을 하였다. 또한 토크 양을 조절할 수 있기 때문에 돌리는 힘도 조절이 가능하다. 하지만 과도한 회전을 하기에는 마찰로 인해 제한이 있다.

 

 

 

블루투스 센서 실습

#include <SoftwareSerial.h>

SoftwareSerial BTSerial(3, 2);

void setup() {

Serial.begin(9600);

BTSerial.begin(9600);

}

void loop() {

if (BTSerial.available()) {

Serial.write(BTSerial.read());

}

if (Serial.available()){

BTSerial.write(Serial.read());

}

}

Code

 

Experimental setup

 

Connecting result

Input at Arduino IDE

Output at android

 

 

블루투스 모듈을 사용하여 핸드폰과 메시지를 주고 받았다. UTF-8 엔코딩 값으로 값을 주고 받으니 영어도 표시가 되었다. 블루투스 모듈의 실습은 핸드폰과 메시지를 주고 받는 것이 전부이며, 해당 어플을 설치를 해야한다는 것이 생각했던 것 보다는 제한적이였다. 블루투스 모듈을 사용하여 다른 기기들과의 통신을 통해 원격으로 프로그램을 실행하는 방법이 있었다면 이용해 보고 싶다.

 

 

 

 

 

 

 

 

Wifi 모듈 실습(STA 모드)

#include <SoftwareSerial.h>

#define WIFI_RX 2

#define WIFI_TX 3

SoftwareSerial WIFI (WIFI_RX, WIFI_TX);

void setup() {

Serial.begin(9600);

WIFI.begin(9600);

}

void loop() {

if (WIFI.available()) {

Serial.write(WIFI.read());

}

if (Serial.available()) {

WIFI.write(Serial.read());

}

}

code

Experimental setup

 

Output at STA mode

와이파이 연결 목록 확인

Wifi connection

 

 

Wifi 모듈을 사용하여 주변 wifi 를 검색하고 원하는 와이파이에 접속을 하였다. 이를 이용하여 wifi 를 사용할 수 있게 되었다.

 

 

 

Wifi 모듈 실습(AP 모드)

#include "WiFiEsp.h"

#include "SoftwareSerial.h"

SoftwareSerial WIFI(2,3); // RX, TX

char ssid[] = "MAKIST";

char pass[] = "12345678";

int status = WL_IDLE_STATUS;

int reqCount = 0;

WiFiEspServer server(80);

RingBuffer buf(8);

void setup()

{

Serial.begin(9600);

WIFI.begin(9600);

WiFi.init(&WIFI);

if (WiFi.status() == WL_NO_SHIELD) {

Serial.println("WiFi shield not present");

while (true);

}

if (WiFi.status() == WL_NO_SHIELD) {

Serial.println("WiFi shield not present");

while (true);

}

Serial.print("Attempting to start AP ");

Serial.println(ssid);

status = WiFi.beginAP(ssid, 10, pass, ENC_TYPE_WPA2_PSK);

Serial.println("Access point started");

printWifiStatus();

// start the web server on port 80

server.begin();

Serial.println("Server started");

}

void loop()

{

WiFiEspClient client = server.available();

if (client) {

Serial.println("New client");

buf.init();

while (client.connected()) {

if (client.available()) {

char c = client.read();

buf.push(c);

if (buf.endsWith("\r\n\r\n")) {

WiFiResponse(client);

break;

}

}

}

delay(10);

client.stop();

Serial.println("Client disconnected");

}

}

void WiFiResponse(WiFiEspClient client)

{

client.print(

"HTTP/1.1 200 OK\r\n"

"Content-Type: text/html\r\n"

"Connection: close\r\n"

"\r\n");

client.print("<!DOCTYPE HTML>\r\n");

client.print("<html>\r\n");

client.print("<h1>Hello World!</h1>\r\n");

client.print("</html>\r\n");

}

void printWifiStatus()

{

// print your WiFi shield's IP address

IPAddress ip = WiFi.localIP();

Serial.print("IP Address: ");

Serial.println(ip);

}

code

 

Output on AP mode

Wifi AP 만들고 접속하기(AP mode) (Arduino IDE)

Wifi AP 만들고 접속하기(AP mode) (computer)

 

Wifi 모듈을 사용하여 wifi 를 생성해 보았다. 이것을 컴퓨터에서 접속하여 와이파이에 접속이 되되는 것 확인하였다. 공유기 같은 wifi 가 아니라서 인터넷 접속은 안되었지만 이를 이용하여 wifi 통신이 가능하다고 생각했다.

Wifi 모듈은 STA 모드와 AP 모드 두가지를 사용하여 필요에따라 주변의 wifi 를 수신할 수 있고, wifi 를 생성하여 통신을 할 수 있게 한다는 장점이 있다.

비록 wifi 모듈을 사용하여 주변의 장치를 원격으로 조종하는 그러한 방식으로 실습 하지는 못했지만 그러한 기능들을 사용할 수 있다면 드론 같은 원격으로 이동하는 장치에서 와이파이를 사용하여 원격으로 프로그램 실행 명령 및 데이터 송,수신 등을 할 수 있다고 생각 하였다.

 

 

CopyRight MAKIST

 

 

 

 

'programming' 카테고리의 다른 글

C ++ 연습장  (0) 2020.07.07
git hub 사용법 Manual  (0) 2020.02.16
ROS 연습장 (python, C++)  (0) 2020.02.03
파이썬 코딩 연습장  (0) 2020.01.10