22.02.24 wemosサーボモータ、シリアルディスプレイI/O、Bluetooth

9898 ワード

サーボモータ実習

  • WemosサーボESP 32サーボ採用
    -スケッチを自動完了可能-ライブラリを含む-zipライブラリ-ESP 32サーボを追加
    ※UNOは#include<サーボです.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);
    
    }
    
    
    
    シリアルモニタI/O
    シリアルモニタで出力されるタイプ
    オフラインending:123
    新しい行:123n-オープン
    CR:123r-タッチパネルカーソルを一番前に移動
    Both NL&CR : 123\n\r
  • Serial.available()
    データ受信時に使用する関数
    データがアドゥイノに入ると、データはシーケンスバッファに格納される
    -シーケンスバッファ(キュー構造-FIFO):複数のデータに移動し、個数を返します.
    Serial.readでデータを読み出して受信する
    リファレンス構造:スタック構造->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); : 最小値を含め、最大値を含まない範囲の乱数を生成
    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("=");
    }
    Bluetoothコントロールアドゥーイノ(アンドロイド)を使用
  • Bluetooth通信用のライブラリを指定:Bluetooth-Bluetoothシリアル
  • を含む

    新しいウィンドウを貼り付ける
  • アプリケーションの実行-Bluetoothコントローラダウンロード
  • ESP<=
  • をクリック
  • Terminal Mode
  • 行末尾なし->新規行
  • 
    #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なので、この部分はすぐに過ぎてしまいます.
  • アドゥイ路間データ通信
    -マザーボードとスレーブボードを指定し、データ通信を実現
    -マザーボードの例-Bluetoothシリアル-シリアルBTM
    =>String name=「デバイス名」およびSerialbt.begin(「デバイス名」,true)セクションを同じに書く
    -マザーボードの例BluetoothSerial-SeerialBT>>slaveから、既存のBluetoothの例のように、取得するデバイス名を読み込んで貼り付け、masterと完全に一致させる=>SerialBT.begin(「デバイス名」)
  • Wifi通信でネットワークに接続
    このクリップに任意のhtmlドキュメントを作成し、localhostセクションを私のIPv 4アドレスに置き換えます
    #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("http://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がオートミールディスプレイに接続されていれば、Wifi接続でOK!200エラーウィンドウが表示されたらhtmlに接続
  • アドゥイノは要求されたクライアントであり、サーブレットはクライアントの要求を受信して応答を送信するサーバであり、
  • .
    http.begin("http://192.168.137.1:8090/IoT/Exam00?data=1234" );
    クエリーを使用してサーバにデータ値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("http://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"); //아두이노 시리얼모니터에 출력됨
    		
    	}
    
    }