이 프로젝트 정보
프로젝트가 끝나면 Android 기기의 가속도 센서로 제어되는 지형 차량을 관리할 것입니다.
이 프로젝트에는 모터 실드, 라즈베리 파이, arduino 및 dc 모터 장치가 포함되어 있습니다.
1단계
먼저 라즈베리파이와 아두이노 사이에 I2C 버스를 만들어야 합니다. 여기에서 I2C를 선택하는 이유를 알 수 있습니다.
아래 그림과 같이 I2C와 모터 쉴드 프로세스를 모두 포함하는 필수 코드를 찾을 수 있습니다.
#include #define MyAddress 0x40#include AF_DCMotor motorhiz(3);AF_DCMotor motoryon(4);byte DataToBeSend[1];byte ReceivedData;int counter =0;void setup(){Serial.begin(9600) ); /* 'I2CReceived'에 I2C Slave 초기화 및 콜백 기능 'onReceive' 할당*/ Wire.begin(MyAddress); Wire.onReceive(I2CReceived); Wire.onRequest(I2CRequest); motorhiz.setSpeed(254); motorhiz.run(릴리스); motoryon.setSpeed(254); motoryon.run(RELEASE);}void loop(){ /* 1초마다 DataToBeSend를 증가시키고 범위가 0에서 99 사이인지 확인합니다. */ //DataToBeSend[0] =(DataToBeSend[0]>=99) ? 0 :DataToBeSend[0] + 1;}/* 이 함수는 RPi2가 이 I2C 슬레이브에 데이터를 보낼 때 자동으로 호출됩니다. */void I2CReceived(int NumberOfBytes){ //counter++; //문자열 counterStr =문자열(카운터); //Serial.println("수신 데이터 :"+counterStr); /* WinIoT가 데이터 바이트를 보냈습니다. 읽어보세요 */ ReceivedData =Wire.read(); int ReceivedDataInt =(int)ReceivedData; 문자열 ReceivedDataStr =문자열(수신 데이터); Serial.println(ReceivedDataInt); if(ReceivedDataInt>=100) //X Datası { Serial.println("DataX :"+ReceivedDataStr); if(ReceivedDataInt> 145 &&ReceivedDataInt <154) { Serial.println("RELEASE"); motorhiz.run(릴리스); } else if(ReceivedDataInt>=100 &&ReceivedDataInt <104) { Serial.println("RELEASE"); motorhiz.run(릴리스); } else if(ReceivedDataInt>=155) { ReceivedDataInt =ReceivedDataInt -155; int motorSpeed =(ReceivedDataInt * 10)+50; if(모터 속도> 254) { 모터 속도 =254; } motorhiz.setSpeed(모터 속도); motorhiz.run(뒤로); 문자열 motorSpeedStr =문자열(motorSpeed); Serial.println("MotorHiz:"+motorSpeedStr); } else if(ReceivedDataInt>=105 ) { ReceivedDataInt =ReceivedDataInt -105; int motorSpeed =(ReceivedDataInt * 10)+50; if(모터 속도> 254) { 모터 속도 =254; } motorhiz.setSpeed(모터 속도); motorhiz.run(앞으로); 문자열 motorSpeedStr =문자열(motorSpeed); Serial.println("MotorHiz:"+motorSpeedStr); } } else // Y Datası { Serial.println("DataX :"+ReceivedDataStr); if(ReceivedDataInt> 45 &&ReceivedDataInt <54) { Serial.println("RELEASE"); motoryon.run(릴리즈); } else if(ReceivedDataInt>=0 &&ReceivedDataInt <4) { Serial.println("릴리즈"); motoryon.run(릴리즈); } else if(ReceivedDataInt>=55) { ReceivedDataInt =ReceivedDataInt -55; int motorSpeed =(ReceivedDataInt * 12)+50; if(모터 속도> 254) { 모터 속도 =254; } motoryon.setSpeed(모터 속도); motoryon.run(뒤로); 문자열 motorSpeedStr =문자열(motorSpeed); Serial.println("MotorHiz:"+motorSpeedStr); } else if(ReceivedDataInt>=5 ) { ReceivedDataInt =ReceivedDataInt -5; int motorSpeed =(ReceivedDataInt * 12)+50; if(모터 속도> 254) { 모터 속도 =254; } motoryon.setSpeed(모터 속도); motoryon.run(앞으로); 문자열 motorSpeedStr =문자열(motorSpeed); Serial.println("MotorHiz:"+motorSpeedStr); } }}/* 이 함수는 RPi2가 이 I2C 슬레이브에서 데이터를 요청할 때 자동으로 호출됩니다. */void I2CRequest(){//Serial.println("DataToBeSend"); /*WinIoT에 데이터 보내기 */ //Wire.write(DataToBeSend,1);}
I2C의 arduino와 raspberry pi 간의 통신을 위한 핀 스키마는 위의 그림과 같습니다. arduino용 외부 전원 공급 장치를 사용할 필요가 없습니다. Arduino는 raspberry pi의 Vout 핀에서 전원을 공급받습니다.
2단계
아래와 같이 I2C를 통해 arduino에 데이터를 보내는 raspberry pi(웹 서버로 작동)에 필요한 코드입니다.
코드는 페이지(코드 섹션)의 끝에서 코드를 찾을 수 있습니다.
3단계
Ajax 요청을 사용하여 가속도계 센서의 데이터를 웹 서버로 보내는 Visual Studio Cordova Android Application을 개발합니다.
코드는 페이지(코드 섹션)의 끝에서 코드를 찾을 수 있습니다.
간단히
1-) 안드로이드 어플리케이션은 센서 데이터(안드로이드 폰 가속도계 데이터)를 라즈베리 파이에서 실행되는 웹 서버로 보냅니다.
2-) 웹 서버는 I2C를 사용하여 데이터(라즈베리 파이가 안드로이드 폰의 가속도계 센서에서 데이터를 얻음)를 arduino로 보냅니다.
3-) Arduino는 데이터를 처리하고 모터 실드를 사용하여 모터를 실행합니다.
섹션> <섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드"> 코드
<울> Wiri.h I2C 통신 및 모토 쉴드 안드로이드 코드
안드로이드 조종기
Windows IOT 웹 서버
Wiri.h I2C 통신 및 모토 쉴드 Android 코드Arduino
arduino와 raspberry pi arduino 코드 간의 I2C 통신. 최소 입력 출력 소스를 갖는 두 장치에 대한 직렬 통신입니다.#include #define MyAddress 0x40#include AF_DCMotor motorhiz(3);AF_DCMotor motoryon(4);byte DataToBeSend[ 1];byte ReceivedData;int 카운터 =0;void setup(){ Serial.begin(9600); /* 'I2CReceived'에 I2C Slave 초기화 및 콜백 기능 'onReceive' 할당*/ Wire.begin(MyAddress); Wire.onReceive(I2CReceived); Wire.onRequest(I2CRequest); motorhiz.setSpeed(254); motorhiz.run(릴리스); motoryon.setSpeed(254); motoryon.run(RELEASE);}void loop(){ /* 1초마다 DataToBeSend를 증가시키고 범위가 0에서 99 사이인지 확인합니다. */ //DataToBeSend[0] =(DataToBeSend[0]>=99) ? 0 :DataToBeSend[0] + 1;}/* 이 함수는 RPi2가 이 I2C 슬레이브에 데이터를 보낼 때 자동으로 호출됩니다. */void I2CReceived(int NumberOfBytes){ //counter++; //문자열 counterStr =문자열(카운터); //Serial.println("수신 데이터 :"+counterStr); /* WinIoT가 데이터 바이트를 보냈습니다. 읽어보세요 */ ReceivedData =Wire.read(); int ReceivedDataInt =(int)ReceivedData; 문자열 ReceivedDataStr =문자열(수신 데이터); Serial.println(ReceivedDataInt); if(ReceivedDataInt>=100) //X Datası { Serial.println("DataX :"+ReceivedDataStr); if(ReceivedDataInt> 145 &&ReceivedDataInt <154) { Serial.println("RELEASE"); motorhiz.run(릴리스); } else if(ReceivedDataInt>=100 &&ReceivedDataInt <104) { Serial.println("RELEASE"); motorhiz.run(릴리스); } else if(ReceivedDataInt>=155) { ReceivedDataInt =ReceivedDataInt -155; int motorSpeed =(ReceivedDataInt * 10)+50; if(모터 속도> 254) { 모터 속도 =254; } motorhiz.setSpeed(모터 속도); motorhiz.run(뒤로); 문자열 motorSpeedStr =문자열(motorSpeed); Serial.println("MotorHiz:"+motorSpeedStr); } else if(ReceivedDataInt>=105 ) { ReceivedDataInt =ReceivedDataInt -105; int motorSpeed =(ReceivedDataInt * 10)+50; if(모터 속도> 254) { 모터 속도 =254; } motorhiz.setSpeed(모터 속도); motorhiz.run(앞으로); 문자열 motorSpeedStr =문자열(motorSpeed); Serial.println("MotorHiz:"+motorSpeedStr); } } else // Y Datası { Serial.println("DataX :"+ReceivedDataStr); if(ReceivedDataInt> 45 &&ReceivedDataInt <54) { Serial.println("RELEASE"); motoryon.run(릴리즈); } else if(ReceivedDataInt>=0 &&ReceivedDataInt <4) { Serial.println("릴리즈"); motoryon.run(릴리즈); } else if(ReceivedDataInt>=55) { ReceivedDataInt =ReceivedDataInt -55; int motorSpeed =(ReceivedDataInt * 12)+50; if(모터 속도> 254) { 모터 속도 =254; } motoryon.setSpeed(모터 속도); motoryon.run(뒤로); 문자열 motorSpeedStr =문자열(motorSpeed); Serial.println("MotorHiz:"+motorSpeedStr); } else if(ReceivedDataInt>=5 ) { ReceivedDataInt =ReceivedDataInt -5; int motorSpeed =(ReceivedDataInt * 12)+50; if(모터 속도> 254) { 모터 속도 =254; } motoryon.setSpeed(모터 속도); motoryon.run(앞으로); 문자열 motorSpeedStr =문자열(motorSpeed); Serial.println("MotorHiz:"+motorSpeedStr); } } }/* 이 함수는 RPi2가 이 I2C 슬레이브에서 데이터를 요청할 때 자동으로 호출됩니다. */void I2CRequest(){ //Serial.println("DataToBeSend"); /*WinIoT에 데이터 보내기 */ //Wire.write(DataToBeSend,1);}
안드로이드 조종기C#
Android 조종기미리보기 없음(다운로드만 가능).
Windows IOT 웹 서버C#
Windows IOT 웹 서버미리보기 없음(다운로드만 가능).
섹션> 맞춤형 부품 및 인클로저
Arduino에서 라즈베리로의 핀 다이어그램
회로도
자세한 내용:https://www.hackster.io/AnuragVasanwala/home-automation-0dcefc