산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

Arduino를 사용한 음성 인식 및 합성

구성품 및 소모품

Arduino Due
× 1
SparkFun Electret 마이크 브레이크아웃
× 1
SparkFun 모노 오디오 앰프 브레이크아웃
× 1
스피커:0.25W, 8옴
× 1
브레드보드(일반)
× 1
5mm LED:빨간색
× 3
저항 330옴
× 3
점퍼 와이어(일반)
× 1

필요한 도구 및 기계

납땜 인두(일반)

앱 및 온라인 서비스

비트보이서 서버 1.0

이 프로젝트 정보

이전 프로젝트에서 Arduino 보드와 BitVoicer 서버를 사용하여 몇 가지 LED를 제어하는 ​​방법을 보여주었습니다. 이 프로젝트에서는 상황을 조금 더 복잡하게 만들 것입니다. 또한 Arduino DUE 디지털-아날로그 변환기(DAC)를 사용하여 음성을 합성할 것입니다. Arduino DUE가 없으면 다른 Arduino 보드를 사용할 수 있지만 DAC를 작동하려면 외부 DAC와 몇 가지 추가 코드가 필요합니다(BVSSpeaker 라이브러리는 도움이 되지 않습니다).

아래 영상에서 아두이노도 작은 노래를 연주하게 하고 LED를 피아노 건반처럼 깜박이게 하는 것을 볼 수 있습니다. 제 피아노 실력에 미안하지만 그게 제가 할 수 있는 최선입니다 :) . LED는 실제로 실제 C, D 및 E 키와 동일한 순서와 타이밍으로 깜박이기 때문에 주변에 피아노가 있으면 LED를 따라 같은 노래를 연주할 수 있습니다. 더 이상 존재하지도 않는 오래된 소매상(Mappin)의 징글입니다.

음성 명령을 LED 활동 및 합성 음성으로 변환하기 위해 다음 절차가 실행됩니다.

<울>
  • 1. 오디오 웨이브는 Sparkfun Electret Breakout 보드에서 캡처 및 증폭됩니다.
  • <울>
  • 2. 증폭된 신호는 아날로그-디지털 변환기(ADC)를 사용하여 Arduino에서 디지털화되고 버퍼링됩니다.
  • <울>
  • 3. 오디오 샘플은 Arduino 직렬 포트를 사용하여 BitVoicer 서버로 스트리밍됩니다.
  • <울>
  • 4. BitVoicer Server는 오디오 스트림을 처리하고 포함된 음성을 인식합니다.
  • <울>
  • 5. 인식된 음성은 Arduino로 다시 전송될 미리 정의된 명령에 매핑됩니다. 명령 중 하나가 음성 합성으로 구성된 경우 BitVoicer Server는 오디오 스트림을 준비하여 Arduino로 보냅니다.
  • <울>
  • 6. Arduino는 명령을 식별하고 적절한 작업을 수행합니다. 오디오 스트림이 수신되면 BVSSpeaker 클래스에 대기하고 DUE DAC 및 DMA를 사용하여 재생됩니다.
  • <울>
  • 7. SparkFun 모노 오디오 앰프는 8옴 스피커를 구동할 수 있도록 DAC 신호를 증폭합니다.
  • 자료 목록:

    <울>
  • Arduino DUE:~U$ 50.00
  • <울>
  • Sparkfun Electret 마이크 브레이크아웃:U$ 7.95
  • <울>
  • SparkFun 모노 오디오 앰프 브레이크아웃:U$ 7.95
  • <울>
  • BitVoicer 서버 1.0:U$ 9.90
  • <울>
  • 8옴 스피커:~U$ 2.00
  • <울>
  • 브레드보드:~U$ 10.00
  • <울>
  • 3 x LED:~U$ 1.00
  • <울>
  • 3 x 330옴 저항:~U$ 0.75
  • <울>
  • 점퍼 전선:~U$ 0.50
  • 1단계:배선

    첫 번째 단계는 아두이노와 브레드보드를 ​​아래 그림과 같이 구성 요소와 연결하는 것입니다. 스피커가 진동이 많이 나고 고무가 없으면 오디오 품질에 상당한 영향을 미치기 때문에 스피커 아래에 작은 고무를 놓아야 했습니다.

    여기에서 이전 프로젝트와 작지만 중요한 차이점이 있습니다. 대부분의 Arduino 보드는 5V에서 실행되지만 DUE는 3.3V에서 실행됩니다. 3.3V에서 Sparkfun Electret Breakout을 실행하는 것이 더 나은 결과를 얻었으므로 5V Arduino 보드를 사용하는 경우 3.3V 핀과 AREF 핀 사이에 점퍼를 추가하는 것이 좋습니다. DUE는 이미 3.3V 아날로그 기준을 사용하므로 AREF 핀에 대한 점퍼가 필요하지 않습니다. 실제로 DUE의 AREF 핀은 저항 브리지를 통해 마이크로컨트롤러에 연결됩니다. AREF 핀을 사용하려면 저항 BR1을 PCB에서 분리해야 합니다.

    2단계:Arduino에 코드 업로드

    이제 아래 코드를 Arduino에 업로드해야 합니다. 편의를 위해 이 게시물 하단의 첨부 파일 섹션에서도 Arduino 스케치를 사용할 수 있습니다. 코드를 업로드하기 전에 BitVoicer 서버 라이브러리를 Arduino IDE에 올바르게 설치해야 합니다(.zip 라이브러리 가져오기).

    Arduino 스케치 :BVS_Demo2.ino

    이 스케치는 7개의 주요 부분으로 구성되어 있습니다.

    <울>
  • 라이브러리 참조 및 변수 선언 :처음 네 줄에는 BVSP, BVSMic, BVSSpeaker 및 DAC 라이브러리에 대한 참조가 포함됩니다. 이러한 라이브러리는 BitSophia에서 제공하며 BitVoicer Server 설치 폴더에서 찾을 수 있습니다. BVSSpeaker 라이브러리에 대한 참조를 추가하면 DAC 라이브러리가 자동으로 포함됩니다. 다른 라인은 스케치 전체에서 사용되는 상수와 변수를 선언합니다. BVSP 클래스는 BitVoicer 서버와 통신하는 데 사용되며 BVSMic 클래스는 오디오 샘플을 캡처 및 저장하는 데 사용되며 BVSSpeaker 클래스는 DUE DAC를 사용하여 오디오를 재생하는 데 사용됩니다.
  • <울>
  • 설정 기능 :이 함수는 다음 작업을 수행합니다. 핀 모드와 초기 상태를 설정합니다. 직렬 통신을 초기화합니다. BVSP, BVSMic 및 BVSSpeaker 클래스를 초기화합니다. 또한 BVSP 클래스의 frameReceived, modeChanged 및 streamReceived 이벤트에 대한 "이벤트 핸들러"(실제로는 함수 포인터임)를 설정합니다.
  • <울>
  • 루프 기능 :이 함수는 다섯 가지 중요한 작업을 수행합니다. 서버에 상태 정보를 요청합니다(keepAlive() 함수). 서버가 데이터를 전송했는지 확인하고 수신된 데이터를 처리합니다(receive() 함수). 오디오 스트림의 녹음 및 전송을 제어합니다(isSREAvailable(), startRecording(), stopRecording() 및 sendStream() 함수). BVSSpeaker 클래스(play() 함수)에 대기 중인 오디오 샘플을 재생합니다. 그리고 playLEDNotes 명령이 수신된 후 LED가 깜박이는 방식을 제어하는 ​​playNextLEDNote() 함수를 호출합니다.
  • <울>
  • BVSP_frameReceived 함수 :이 함수는 하나의 완전한 프레임이 수신되었음을 수신() 함수가 식별할 때마다 호출됩니다. 여기에서 BitVoicer 서버에서 보낸 명령을 실행합니다. LED를 제어하는 ​​명령에는 2바이트가 포함됩니다. 첫 번째 바이트는 핀을 나타내고 두 번째 바이트는 핀 값을 나타냅니다. analogWrite() 함수를 사용하여 핀에 적절한 값을 설정합니다. 그리고 Byte 타입의 playLEDNotes 명령어를 받았는지 확인한다. 수신된 경우 playLEDNotes를 true 로 설정했습니다. 그리고 현재 시간을 표시합니다. 이 시간은 playNextLEDNote 기능에서 LED를 노래와 동기화하는 데 사용됩니다.
  • <울>
  • BVSP_modeChanged 함수 :이 함수는 receive() 함수가 아웃바운드 방향(Server --> Arduino)의 모드 변경을 식별할 때마다 호출됩니다. 와!!! 저게 뭐에요?! BitVoicer Server는 프레임 데이터 또는 오디오 스트림을 Arduino로 보낼 수 있습니다. 통신이 한 모드에서 다른 모드로 이동하기 전에 BitVoicer Server는 신호를 보냅니다. BVSP 클래스는 이 신호를 식별하고 modeChanged 이벤트를 발생시킵니다. BVSP_modeChanged 함수에서 통신이 스트림 모드에서 프레임 모드로 전환되는 것을 감지하면 오디오가 종료되었음을 알고 BVSSpeaker 클래스에 오디오 샘플 재생을 중지하도록 지시할 수 있습니다.
  • <울>
  • BVSP_streamReceived 함수 :이 함수는 수신() 함수가 오디오 샘플이 수신되었음을 식별할 때마다 호출됩니다. 나는 단순히 샘플을 검색하고 BVSSpeaker 클래스에 대기열에 넣어 play() 함수가 샘플을 재생할 수 있도록 합니다.
  • <울>
  • playNextLEDNote 기능 :이 함수는 BVSP_frameReceived 함수가 playLEDNotes 명령을 식별하는 경우에만 실행됩니다. BitVoicer 서버에서 전송된 오디오와 LED를 제어하고 동기화합니다. LED를 오디오와 동기화하고 정확한 타이밍을 알기 위해 Sonic Visualizer를 사용했습니다. 이 무료 소프트웨어를 사용하면 오디오 파형을 볼 수 있어 피아노 건반을 눌렀을 때 쉽게 알 수 있었습니다. 그것은 또한 타임 라인을 보여주는데 이것이 내가 이 함수에 사용된 밀리초를 얻은 방법입니다. 어리석은 속임수처럼 들리고 그렇습니다. 오디오 스트림을 분석하고 해당 LED를 켜는 것이 가능할 것이라고 생각하지만 그건 제가 할 수 있는 일이 아닙니다.
  • 3단계:BitVoicer 서버 솔루션 개체 가져오기

    이제 Arduino와 함께 작동하도록 BitVoicer 서버를 설정해야 합니다. BitVoider Server에는 위치, 장치, BinaryData 및 음성 스키마의 4가지 주요 솔루션 개체가 있습니다.

    위치는 장치가 설치된 물리적 위치를 나타냅니다. 제 경우에는 Home이라는 위치를 만들었습니다.

    장치는 BitVoicer 서버 클라이언트입니다. 나는 ArduinoDUE라는 이름의 혼합 장치를 만들고 통신 설정을 입력했습니다. 중요 :Arduino DUE조차도 BitVoicer Server가 스트리밍할 모든 오디오 샘플을 저장할 수 있는 소량의 메모리가 있습니다. 대역폭을 제한하지 않으면 오디오를 저장하기 위해 훨씬 더 큰 버퍼가 필요합니다. 이런 이유로 버퍼 오버플로가 발생하여 통신 설정에서 데이터 속도를 초당 8000샘플로 제한해야 했습니다.

    BinaryData는 BitVoicer Server가 클라이언트 장치에 보낼 수 있는 명령 유형입니다. 실제로는 명령에 연결할 수 있는 바이트 배열입니다. BitVoider Server는 해당 명령과 관련된 음성을 인식하면 바이트 배열을 대상 장치로 보냅니다. 각 핀 값에 대해 하나의 BinaryData 개체를 만들고 ArduinoDUEGreenLedOn, ArduinoDUEGreenLedOff 등으로 이름을 지정했습니다. 내 솔루션에 18개의 BinaryData 개체가 있으므로 VoiceSchema.sof에서 개체를 다운로드하여 가져오는 것이 좋습니다. 아래 파일.

    음성 스키마는 모든 것이 결합되는 곳입니다. 그들은 어떤 문장을 인식하고 실행할 명령을 정의합니다. 각 문장에 대해 필요한 만큼 명령과 실행 순서를 정의할 수 있습니다. 명령 사이의 지연을 정의할 수도 있습니다. 그렇게 해서 동영상에서 볼 수 있는 일련의 작업을 수행할 수 있었습니다.

    내 음성 스키마의 문장 중 하나는 "작은 노래를 재생합니다."입니다. 이 문장에는 두 가지 명령이 포함되어 있습니다. 첫 번째 명령은 다음 명령이 오디오 스트림이 될 것임을 나타내는 바이트를 보냅니다. 그런 다음 Arduino는 오디오가 전송되는 동안 LED를 "재생"하기 시작합니다. 오디오는 제가 직접 녹음해서 두 번째 커맨드의 음원으로 설정한 작은 피아노 징글입니다. BitVoider Server는 8비트 모노 PCM 오디오(초당 8000샘플)만 지원하므로 오디오 파일을 이 형식으로 변환해야 하는 경우 다음 온라인 변환 도구를 권장합니다. http://audio.online-convert.com/convert -to-wav.

    아래 파일에서 이 프로젝트에서 사용한 모든 솔루션 개체를 가져올 수 있습니다(솔루션 개체 가져오기). 하나는 DUE 장치를 포함하고 다른 하나는 음성 스키마와 해당 명령을 포함합니다.

    솔루션 개체 파일 :

    <울>
  • Device.sof
  • <울>
  • VoiceSchema.sof
  • 4단계:결론

    저기요! 모든 것을 켜고 동영상에 표시된 것과 동일한 작업을 수행할 수 있습니다.

    이전 프로젝트에서 했던 것처럼 BitVoicer Server Manager에서 Arduino 장치를 활성화하여 음성 인식을 시작했습니다. 활성화되는 즉시 Arduino는 사용 가능한 음성 인식 엔진을 식별하고 BitVoicer 서버로 오디오 스트리밍을 시작합니다. 그러나 이제 BitVoicer 서버에서 Arduino로 오디오가 스트리밍되는 동안 Arduino RX LED에서 훨씬 더 많은 활동을 볼 수 있습니다.

    다음 프로젝트에서는 조금 더 야심차게 준비하겠습니다. 하나의 Arduino에 WiFi 통신을 추가하고 두 개의 다른 Arduino를 모두 음성으로 제어할 것입니다. 나는 그들 사이에 어떤 종류의 게임을 생각하고 있습니다. 제안을 환영합니다!

    <섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

    코드

    <울>
  • 아두이노 스케치
  • Arduino 스케치Arduino
    #include #include #include #include // 오디오를 캡처하는 데 사용할 Arduino 핀을 정의합니다. #define BVSM_AUDIO_INPUT 7// LED 핀 정의#define RED_LED_PIN 6#define YELLOW_LED_PIN 9#define GREEN_LED_PIN 10// BVSP.begin 함수에 매개변수로 전달될 상수를 정의합니다. const unsigned long STATUS_REQUEST_TIMEOUT =3000;_STATUS unsigned long 마이크 오디오 버퍼의 크기 정의 const int MIC_BUFFER_SIZE =64;// 스피커 오디오 버퍼의 크기 정의 const int SPEAKER_BUFFER_SIZE =128;// 수신 버퍼의 크기 정의 const int RECEIVE_BUFFER_SIZE =2;// new global instance 초기화 BVSP 클래스의 BVSP bvsp =BVSP();// BVSMic 클래스의 새 전역 인스턴스를 초기화합니다. BVSMic bvsm =BVSMic();// BVSSpeaker 클래스의 새 전역 인스턴스를 초기화합니다. BVSSpeaker bvss =BVSSpeaker();// 생성 // t에서 기록된 샘플을 읽는 데 사용할 버퍼 he BVSMic class byte micBuffer[MIC_BUFFER_SIZE];// 오디오 샘플을 쓰는 데 사용할 버퍼를 생성합니다. // BVSSpeaker 클래스에 byte speakerBuffer[SPEAKER_BUFFER_SIZE];// 보낸 명령을 읽는 데 사용할 버퍼를 만듭니다. // BitVoicer 서버에서.// 바이트 0 =핀 번호// 바이트 1 =핀 값 바이트 receiveBuffer[RECEIVE_BUFFER_SIZE];// 이 변수는 재생 시기를 제어하는 ​​데 사용됩니다// "LED 노트". 이 음표는 BitVoicer Server.bool에서 스트리밍된 // 노래와 함께 재생됩니다. playLEDNotes =false;unsigned int playStartTime =0;void setup() { // 핀 모드 설정 pinMode(RED_LED_PIN, OUTPUT); 핀모드(YELLOW_LED_PIN, 출력); 핀모드(GREEN_LED_PIN, 출력); // 모든 LED의 초기 상태를 설정합니다. digitalWrite(RED_LED_PIN, LOW); 디지털 쓰기(YELLOW_LED_PIN, LOW); 디지털 쓰기(GREEN_LED_PIN, LOW); // 115200 bps에서 직렬 통신을 시작합니다. Serial.begin(115200); // 통신에 사용될 Arduino 직렬 포트, // 상태 요청이 시간 초과되기까지 걸리는 시간 및 // 상태 요청이 BitVoicer 서버로 전송되어야 하는 // 빈도를 설정합니다. bvsp.begin(시리얼, STATUS_REQUEST_TIMEOUT, STATUS_REQUEST_INTERVAL); // frameReceived를 처리할 함수를 정의합니다. // 이벤트 bvsp.frameReceived =BVSP_frameReceived; // modeChanged를 처리할 함수를 설정합니다. // 이벤트 bvsp.modeChanged =BVSP_modeChanged; // streamReceived를 처리할 함수를 설정합니다. // 이벤트 bvsp.streamReceived =BVSP_streamReceived; // BVSMic 클래스 타이머 준비 bvsm.begin(); // BVSSpeaker에서 사용할 DAC를 설정합니다. class bvss.begin(DAC);}void loop() { // 상태 요청 간격이 경과했는지 확인하고 // 경과했다면 상태 요청을 BitVoicer 서버로 보냅니다. bvsp.keepAlive(); // 직렬 포트 버퍼에 사용 가능한 데이터가 있는지 확인하고 // BitVoicer 서버 프로토콜 사양에 따라 해당 내용을 처리합니다. bvsp.receive(); // 사용 가능한 SRE가 하나 있는지 확인합니다. 있는 경우 // 녹음을 시작합니다. if (bvsp.isSREAvailable()) { // BVSMic 클래스가 녹음 중이 아니면 // 오디오 입력을 설정하고 녹음을 시작합니다. if (!bvsm.isRecording) { bvsm.setAudioInput(BVSM_AUDIO_INPUT, DEFAULT); bvsm.startRecording(); } // BVSMic 클래스에 사용 가능한 샘플이 있는지 확인합니다. if (bvsm.available) { // 스트림을 전송하기 전에 // 인바운드 모드가 STREAM_MODE인지 확인합니다. if (bvsp.inboundMode ==FRAMED_MODE) bvsp.setInboundMode(STREAM_MODE); // BVSMic 클래스에서 오디오 샘플을 읽습니다. int bytesRead =bvsm.read(micBuffer, MIC_BUFFER_SIZE); // 오디오 스트림을 BitVoicer 서버로 보냅니다. bvsp.sendStream(micBuffer, bytesRead); } } else { // 사용 가능한 SRE가 없습니다. BVSMic 클래스가 녹음 중이면 // 중지합니다. if (bvsm.isRecording) bvsm.stopRecording(); } // BVSSpeaker 클래스에서 사용 가능한 모든 오디오 샘플을 재생합니다. // 내부 버퍼. 이러한 샘플은 // BVSP_streamReceived 이벤트 핸들러에 작성됩니다. // 내부 버퍼에서 사용할 수 있는 샘플이 없으면 아무 것도 재생되지 않습니다. bvss.play(); // playLEDNotes가 true로 설정된 경우 // 음악과 함께 "LED 음표"를 재생합니다. if (playLEDNotes) playNextLEDNote();}// frameReceived 이벤트 처리 void BVSP_frameReceived(byte dataType, int payloadSize) { // 수신된 프레임에 바이너리 데이터가 포함되어 있는지 확인 // 0x07 =바이너리 데이터(바이트 배열) if (dataType ==DATA_TYPE_BINARY) { // 2바이트를 받았으면 명령어를 처리한다. if (bvsp.getReceivedBytes(receiveBuffer, RECEIVE_BUFFER_SIZE) ==RECEIVE_BUFFER_SIZE) { analogWrite(receiveBuffer[0], receiveBuffer[1]); } } // 수신된 프레임에 바이트 데이터 타입이 포함되어 있는지 확인 // 0x01 =바이트 데이터 타입 else if (dataType ==DATA_TYPE_BYTE) { // 수신된 바이트 값이 255이면 playLEDNotes를 // 설정하고 현재 시간을 표시한다. if (bvsp.getReceivedByte() ==255) { playLEDNotes =true; playStartTime =밀리(); } }}// modeChanged 이벤트를 처리합니다. void BVSP_modeChanged() { // outboundMode(서버 --> 장치)가 // FRAMED_MODE로 바뀌면 오디오 스트림이 수신되지 않아야 합니다. // BVSSpeaker 클래스가 내부 버퍼가 비면 // 재생을 끝내도록 지시합니다. if (bvsp.outboundMode ==FRAMED_MODE) bvss.finishPlaying();} // streamReceived 이벤트 처리 void BVSP_streamReceived(int size) { // BVSP 클래스에서 수신된 스트림 가져오기 int bytesRead =bvsp.getReceivedStream(speakerBuffer, SPEAKER_BUFFER_SIZ; // 수신된 스트림을 대기열에 넣어 재생 bvss.enqueue(speakerBuffer, bytesRead);}// 시간에 따라 적절한 LED를 켭니다. // LED 노트 재생 시작 명령이 수신되었습니다.// 여기에 사용된 타이밍은 다음과 동기화됩니다. music.void playNextLEDNote(){ // playStartTime과 현재 시간 사이의 경과 시간을 // 가져옵니다. 서명되지 않은 긴 경과 =millis() - playStartTime; // 모든 LED를 끕니다. allLEDsOff(); // 마지막 음이 연주되었습니다. // 마지막 LED를 끄고 LED 노트 재생을 중지합니다. if (경과>=11500) { analogWrite(RED_LED_PIN, 0); playLEDNotes =거짓; } else if (경과>=9900) analogWrite(RED_LED_PIN, 255); // C 참고 else if (elapsed>=9370) analogWrite(RED_LED_PIN, 255); // C 참고 else if (elapsed>=8900) analogWrite(YELLOW_LED_PIN, 255); // D 참고 else if (elapsed>=8610) analogWrite(RED_LED_PIN, 255); // C 참고 else if (elapsed>=8230) analogWrite(YELLOW_LED_PIN, 255); // D note else if (elapsed>=7970) analogWrite(YELLOW_LED_PIN, 255); // D 참고 else if (elapsed>=7470) analogWrite(RED_LED_PIN, 255); // C 참고 else if (elapsed>=6760) analogWrite(GREEN_LED_PIN, 255); // E 참고 else if (elapsed>=6350) analogWrite(RED_LED_PIN, 255); // C 참고 else if (elapsed>=5880) analogWrite(YELLOW_LED_PIN, 255); // D 참고 else if (elapsed>=5560) analogWrite(RED_LED_PIN, 255); // C 참고 else if (elapsed>=5180) analogWrite(YELLOW_LED_PIN, 255); // D 참고 else if (elapsed>=4890) analogWrite(YELLOW_LED_PIN, 255); // D 참고 else if (elapsed>=4420) analogWrite(RED_LED_PIN, 255); // C 참고 else if (elapsed>=3810) analogWrite(GREEN_LED_PIN, 255); // E 참고 else if (elapsed>=3420) analogWrite(RED_LED_PIN, 255); // C 참고 else if (elapsed>=2930) analogWrite(YELLOW_LED_PIN, 255); // D 참고 else if (elapsed>=2560) analogWrite(RED_LED_PIN, 255); // C 참고 else if (elapsed>=2200) analogWrite(YELLOW_LED_PIN, 255); // D 참고 else if (elapsed>=1930) analogWrite(YELLOW_LED_PIN, 255); // D 참고 else if (elapsed>=1470) analogWrite(RED_LED_PIN, 255); // C 참고 else if (elapsed>=1000) analogWrite(GREEN_LED_PIN, 255); // E note}// 모든 LED를 끕니다. 무효 allLEDsOff(){ analogWrite(RED_LED_PIN, 0); analogWrite(YELLOW_LED_PIN, 0); analogWrite(GREEN_LED_PIN, 0);}

    회로도


    제조공정

    1. Python과 함께 Arduino 및 RFID를 사용한 출석 시스템
    2. DHT11 센서(LED 및 피에조 스피커 포함)
    3. NeoPixel Ring으로 재미있는 자이로스코프
    4. Arduino Temp. 3.2 디스플레이가 있는 모니터 및 실시간 시계
    5. Arduino 및 Android 기기로 Roomba 로봇 제어
    6. Arduino 및 Nokia 5110 디스플레이가 있는 DIY 전압계
    7. Arduino 및 MPU6050으로 서보 모터 제어
    8. U-blox LEA-6H 02 GPS 모듈(Arduino 및 Python 포함)
    9. DHT11로 Blynk에서 온도와 습도를 읽는 방법
    10. 4x4x4 LED 큐브(Arduino Uno 및 1쉴드 포함