시리얼 모니터 서보모터 - silieol moniteo seobomoteo

서보모터 실습

  • wemos servo는 ESP32_Servo를 사용함
    -자동완성할수있음 스케치-라이브러리포함하기-zip라이브러리추가-ESP32_Servo
    ※UNO는 #include<Servo.h>

  • 가변저항으로 서보모터 각도 제어하기

  • 가변저항은 센서(외부 상태 알려줌)이므로 INPUT

  • 센서로부터값을 시리얼모니터에 출력해야됨 =>잘읽힌다면 0~4095비트

  • write의 각도는 0~179도 --->범위변환 map함수 사용

#include <ESP32_Servo.h>//서보모터 라이브러리 불러와 사용 Servo myServo; // Scanner sc int servoPin = 17; int potPin = 34; void setup() { myServo.attach(servoPin); //서보모터의 핀모드 Serial.begin(115200); } void loop() { int sensorValue = analogRead(potPin); Serial.println(sensorValue); int mapValue = map(sensorValue,0,4095,0,179); 돌아가는 방향 바꾸려면 가변저항의 + - 를 바꾸거나, 0, 4095 위치를 바꾸거나 0,179의 위치를 바꾸면 +- 가 바뀐다 myServo.write(mapValue); }

시리얼모니터 입 출력

시리얼모니터에 출력되는 종류
line ending 없음 : 123
새줄 : 123\n - 개행됨
CR : 123\r - 엔터치면 커서가 맨앞으로감
Both NL&CR : 123\n\r

  • Serial.available()
    시리얼 통신할 때, 데이터 수신시 사용되는함수
    아두이노에 데이터가 들어올때 시리얼 버퍼에 데이터가 저장됨
    -시리얼 버퍼(큐구조-FIFO): 탐색해서 자료가 몇개인지 검색, 개수가 리턴됨
    Serial.read를통해 데이터를 읽고 데이터 수신이 이루어짐
    자료구조 참고 : stack구조-> FILO / Queue구조->FIFO
    Serial.read()를 통해 읽어들인 값을 char, String 등으로 저장-> 읽은 값은 시리얼버퍼에서 사라짐
    char는 여러문자열을 개행해서 출력함 주의
// 1,2,3 입력시 led 제어 int ledPin1=18; int ledPin2=19; int ledPin3=23; void setup() { Serial.begin(115200); pinMode(ledPin1, OUTPUT); pinMode(ledPin2, OUTPUT); pinMode(ledPin3, OUTPUT); } void loop() { if(Serial.available()){ //시리얼통신이 온다면 //시리얼 버퍼(큐구조-FIFO) 탐색해서 자료가 몇개인지 검색 , 개수가 리턴됨 //자료구조 참고 : stack구조-> FILO / Queue구조->FIFO //C++에서는 if문에 정수가능- 0은F, 1이상 T char c = Serial.read(); //시리얼버퍼의 맨먼저 값을 하나 꺼내서 사라지고 값이 char에 저장됨 Serial.println(c); //큰if문 안 if ↓↓↓ if(c=='1'){ //char형태라 문자열로 인식됨 digitalWrite(ledPin1, HIGH); } else if(c=='2'){ digitalWrite(ledPin2, HIGH); } else if(c=='3'){ digitalWrite(ledPin3, HIGH); } else if(c=='0'){ digitalWrite(ledPin1, 0); digitalWrite(ledPin2, 0); digitalWrite(ledPin3, 0); } } }

시리얼모니터에 랜덤 플러스 게임 생성하기 -> 값 입력받고, 정답일때 오답일때 각 출력하기

랜덤 숫자 출력하는 함수 : random();
random(num) ; : 0 ~ num-1 랜덤숫자 생성
random(min,max); : min값 포함, max값 포함안되는 범위의 랜덤숫자 생성

int num1=0; //루프문안에서 랜덤값 출력을 위한 전역변수 int num2=0; void setup() { Serial.begin(115200); Serial.println("====Game Start===="); sendQuiz(); //랜덤값 추출하고 정수 추출하는 메서드로 만들어줌 .. 아래서 확인,, } void loop() { //입력 받고 정답이라면 "정답입니다" 오답이라면"오답입니다" 출력 if(Serial.available()){ //계속해서 버퍼탐색 int input = Serial.parseInt(); //정수형으로 형변환이 필요한 이유: 아두이노자체에서 아스키코드로 변환해버리기 때문 Serial.println(input); if(num1+num2 == input){ Serial.println("정답입니다"); }else { Serial.println("오답입니다"); } sendQuiz(); } } void sendQuiz() { num1 = random(9) + 1; //1~9 랜덤숫자 생성 num2 = random(1,10); //min값 포함, max값 포함안됨 Serial.print(num1); Serial.print("+"); Serial.print(num2); Serial.print("="); }

맞출수록 레벨이 올라가고 틀릴수록 한단계씩 내려가는 게임 만들기, 0입력시 게임 종료(cnt변수추가)

int num1 = 0; int num2 = 0; int cnt = 0; //정답횟수 저장하는 변수 boolean check = true; //0입력을 위한 변수 선언 void setup() { Serial.begin(115200); Serial.println("====Game Start===="); sendQuiz(); } void loop() { //입력 받고 정답이라면 "정답입니다" 오답이라면"오답입니다" 출력 //0입력시 종료 //정답을 맞출수록 문제난이도 상승->두자리수-세자리수-...n자리수덧셈으로 if(Serial.available()){ //계속해서 버퍼탐색 int input = Serial.parseInt(); Serial.println(input); if(input == 0){ check = false; //false지정하면 바로아래if문 거치지않음 Serial.println("종료되었습니다."); } if(check){ if(num1+num2 == input){ Serial.println("정답입니다"); cnt++; }else { Serial.println("오답입니다"); if(cnt>0){ cnt--; //cnt가 0이었다면 음수가 되니까 조건을 0이상으로 줌 } } sendQuiz(); } //------- if(check) 끝나는 부분 } } void sendQuiz() { num1 = random(pow(10,cnt), pow(10, cnt+1)); num2 = random(pow(10,cnt), pow(10, cnt+1)); //min:10^cnt, max:10^cnt+1 //pow(수,지수)=>거듭제곱 값이 나옴 Serial.print(num1); Serial.print("+"); Serial.print(num2); Serial.print("="); }

블루투스로 아두이노 제어하기(안드로이드)

  • 블루투스 통신을 위한 라이브러리 지정하기: 블루투스 포함하기-BluetoothSerial


에서 새로 나온 창 복붙해오기

  1. 어플리케이션 실행 -블루투스 아두이노 블루투스 컨트롤러 다운받기
  2. ESP___ <= 클릭
  3. Terminal Mode
  4. line ending 없음 -> 새 줄
#include "BluetoothSerial.h" #if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED) #error Bluetooth is not enabled! Please run `make menuconfig` to and enable it #endif BluetoothSerial SerialBT; void setup() { Serial.begin(115200); SerialBT.begin("ESP32gogo"); //블루투스검색시 모듈이름 Bluetooth device name Serial.println("The device started, now you can pair it with bluetooth!"); } void loop() { if (Serial.available()) { SerialBT.write(Serial.read()); } if (SerialBT.available()) { Serial.write(SerialBT.read()); } delay(20); }

폰기종 운영체제가 IOS라 이부분은 빠르게 넘어갔다..

  • 아두이노간 데이터 통신
    -master보드와 slave보드를 지정해 데이터 통신이 가능하다
    -master보드 예제-bluetoothSerial-SerialtoSerialBTM
    =>String name = "장치명" 과 SerialBT.begin("장치명", true)부분 동일하게 써주기
    -slave보드 예제 bluetoothSerial-SerialtoSerialBT >>slave는 기존 블루투스 예제처럼 불러와 복붙하고 검색될 장치명 이름을 master와 똑같게 맞춰줌 => SerialBT.begin("장치명")

Wifi통신으로 아두이노와 웹 연결

이클립스에서 임의의 html문서만들기 -> 실행해서 localhost부분을 나의 IPv4주소로 바꿔준다

#include <WiFi.h> #include <HTTPClient.h> const char* ssid = "???"; //wifi id const char* password = "???"; //wifi pw String result = ""; void setup() { Serial.begin(115200); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.println("Connecting to WiFi.."); } Serial.println("Connected to the WiFi network"); } void loop() { if ((WiFi.status() == WL_CONNECTED)) { //Check the current connection status HTTPClient http; http.begin("//192.168.137.1:8090/IoT/index.html"); int httpCode = http.GET(); //Make the request if (httpCode > 0) { //Check for the returning code Serial.println(httpCode); result = http.getString(); Serial.println(result); } else { Serial.println("Error on HTTP request"); } http.end(); //Free the resources } delay(1000); }

시리얼모니터에 wifi connected가 뜨면 와이파이 연결이 된 것! 200 에러 창이 뜨면 연결 html과 연결된 것

  • 아두이노는 요청하는 클라이언트, 서블릿은 클라이언트의 요청을 받아, 응답을 보내줄 서버 역할을 함

http.begin("//192.168.137.1:8090/IoT/Exam00?data=1234");
쿼리스트링방식 사용해서 서블릿으로 data의 값 1234를 보냄 -> data?=1234
서블릿 예제파일을 아래처럼 만들어줌

#include <WiFi.h> #include <HTTPClient.h> const char* ssid = "아이디"; const char* password = "비번"; String result = ""; void setup() { Serial.begin(115200); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.println("Connecting to WiFi.."); } Serial.println("Connected to the WiFi network"); } void loop() { if ((WiFi.status() == WL_CONNECTED)) { //Check the current connection status HTTPClient http; http.begin("//192.168.137.1:8090/IoT/Exam00?data=1234"); //쿼리스트링방식 사용해서 만들어놓은 서블릿으로 data의 값 1234를 보냄 -> data?=1234 int httpCode = http.GET(); //Make the request if (httpCode > 0) { //Check for the returning code Serial.println(httpCode); result = http.getString(); Serial.println(result); } else { Serial.println("Error on HTTP request"); } http.end(); //Free the resources } delay(1000); } package test; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/Exam00") public class Exam00 extends HttpServlet { private static final long serialVersionUID = 1L; protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html; charset=UTF-8"); PrintWriter out = response.getWriter(); //아두이노로 보내줄 출력스트림 out객체 생성 String data = request.getParameter("data"); //아두이노로부터 쿼리스트링으로 받아온 data System.out.println(data); //콘솔창에 데이터 출력 out.print("안녕하세요 / Hello World"); //아두이노 시리얼모니터에 출력됨 } }

Toplist

최신 우편물

태그