제조공정
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
| ||||
|
| ||||
|
약 1년 전 제 아들과 나 만든 Arduino가 있는 전자 주사위 및 몇 개의 LED. 이것은 여전히 초보자에게 이상적인 프로젝트입니다. 우리는 올해 많은 것을 배웠으므로 업데이트할 적기입니다.
주사위는 여전히 완벽한 스타터 프로젝트입니다. 기능은 모든 사람에게 명확하며 마이크로 컨트롤러, 간단한 전자 제품 및 코딩과 같은 다양한 영역을 쉽게 이해할 수 있습니다.
버전 2.0
주사위도 환상적입니다. 한 단계 더 나아가 다른 영역을 연결하는 것입니다.
오늘날에는 거의 모든 것에 대한 기성 구성 요소가 있습니다. 이것은 Arduino 또는 Raspberry Pi용 스타터 키트를 찾을 때 가장 잘 나타납니다. LED, 푸시 버튼 및 모든 유형의 센서와 같은 구성 요소는 회로 기판에 내장되어 있으므로 몇 개의 전선으로 GPIO에 연결하고 사용할 수 있습니다.
간단하지만 충분한 3D 프린터는 ebay에서 140유로 미만으로 구입할 수 있습니다. 거의 모든 브래킷, 마운팅 또는 케이싱 변형을 사용할 수 있습니다.
자신의 프로젝트를 개발할 수 있는 더 많은 기회가 있습니다. 이것의 예는 우리의 새로운 주사위 2.0입니다.
기울기 센서
우리는 완전히 다른 방식으로 주사위를 구현합니다. 내부에서 Arduino Nano는 공간상의 이유로 작동합니다. 온오프 스위치는 있지만 버튼은 없습니다. 다이싱은 큐브 전체를 흔들어서 수행됩니다.
이를 위해 기울기 센서 또는 진동 센서가 사용됩니다. 버튼처럼 작동합니다. 유리관에서 공이 움직입니다. 연결 접점에 닿으면 회로가 닫힙니다. 때때로 매우 짧은 이 접점은 신호에 사용됩니다.
센서를 흔들면 금속구의 움직임이 꽤 잘 들립니다.
일반적으로 틸트 센서의 경우 설치 위치가 결정적입니다. 특정 각도 위치에서 신호를 트리거해야 합니다. 우리의 경우 케이스를 흔들어서 발생합니다. 어떤 방향으로든 흔들릴 때 신호가 트리거되기 때문에 상황은 그렇게 중요하지 않습니다. 안전을 위해 프로젝트에서 서로 90° 오프셋된 두 개의 센서를 사용합니다. 따라서 항상 안정적인 흔들림 신호를 받습니다.
인터럽트
흔들림을 인식하려면 기울기 센서의 입력 핀을 스케치에서 쿼리해야 합니다. 그러나 이 일이 제 시간에 발생하는 시기와 스케치가 해야 할 다른 작업에 따라 하나 이상의 이벤트가 눈에 띄지 않게 될 가능성이 항상 있습니다.
더 나은 솔루션은 하드웨어 인터럽트를 사용하는 것입니다. 이것은 attachInterrupt 함수에 의해 정의됩니다. 신호에서 호출될 서브프로그램이 매개변수로 지정됩니다.
Arduino는 핀 D2와 D3의 두 가지 하드웨어 인터럽트를 제공합니다.
디스플레이
물론 주사위 이미지의 표시는 7개의 개별 LED로 다시 수행할 수 있습니다. 하지만 여기서 완성된 구성 요소를 사용하는 것도 더 흥미롭습니다.
이 프로젝트에 대한 우리의 선택은 MAX7219 드라이버 IC가 있는 8x8 LED 매트릭스에 있습니다. 공간을 거의 차지하지 않고 비용도 적게 들고 코딩하기도 쉽습니다.
구입처에 따라 부품 하나하나를 함께 납땜하고 조립해야 합니다. 그것은 일반적으로 문제가 되지 않습니다. 저지를 수 있는 유일한 실수는 LED 매트릭스를 꼬아서 잭에 넣는 것입니다.
이것은 위의 그림으로 표시됩니다. 여기서 매트릭스를 소켓에서 조심스럽게 당겨 180° 돌리면 충분합니다.
일부 물리학
결과적으로 LED 매트릭스는 주사위 이미지만 보여서는 안 됩니다. 약간의 쇼 효과를 제공해야 합니다. 6개의 주사위 눈이 매트릭스에서 움직입니다. 가장자리에서 튕겨져 나와 천천히 속도를 잃습니다.
두 개의 기울기 센서를 통해 얼마나 흔들렸는지 알 수 있습니다. 이 정보는 주사위 눈에 움직임에 대한 "속도"로 제공됩니다.
주사위 결과를 표시할 때도 유사한 효과를 사용합니다. 눈은 임의의 위치에서 큐브 이미지의 올바른 위치로 굴러갑니다.
전원 공급 장치
먼저 공간상의 이유로 2개의 3V CR2032 버튼 셀을 설치했습니다. 처음에는 이것도 꽤 괜찮아 보였다. Arduino와 LED 매트릭스가 함께 작동했고 모든 것이 작동했습니다. 그러나 몇 분 동안 작동하면 버튼 셀의 전원이 끊어집니다.
모든 주사위 후에 Arduino를 끄면 그런 식으로 사용할 수 있습니다. 그것은 완벽하지 않으므로 더 나은 두 개의 AAA 배터리를 설치합니다. 그러나 이들은 3V만 함께 제공합니다. 따라서 전압을 5V로 높이는 승압 컨버터가 여전히 필요합니다. 연결은 여전히 Arduino의 VIN 핀에서 이루어집니다.
주택 디자인
적합한 하우징을 위한 최상의 옵션은 3D 프린팅을 통한 자체 설계 및 생산입니다. 건설을 위한 많은 앱이 있습니다. 이 프로젝트에 Autodesk Fusion 360을 사용했습니다. 그것은 훌륭한 기능을 가지고 있으며 3D 인쇄는 Print Studio 소프트웨어와 잘 통합되어 있습니다. Autodesk Fusion 360에 관심이 있는 경우 블로그 기사 Parametric Enclosures(독일어만)에서 몇 가지 제안 사항을 찾을 수 있습니다.
우리의 주택은 세 부분으로 구성되어 있습니다:
<울>LED 매트릭스는 전면에 유백색 플렉시 유리 커버가 있으면 훨씬 더 잘 보입니다. 이렇게 하면 꺼진 LED를 인식할 수 없고 영상이 더 선명해집니다.
스케치
LED Matrix를 제어하려면 LedControl 라이브러리가 필요합니다. 아직 설치되어 있지 않다면 arduino.cc https://playground.arduino.cc/Main/LedControl에서 다운로드할 수 있습니다.
그런 다음 다른 변수 정의를 수행합니다. 먼저 주사위 눈이 행렬에 표시되는 방식을 결정합니다. 주사위 눈은 4개의 LED 포인트로 구성됩니다. 배열에서 왼쪽 상단 모서리는 X/Y 좌표로 지정됩니다(-1은 디스플레이 외부를 의미).
int DicePic[8][6][2] ={ … { //1:{4,4}, //1. 펑크 {-1,-1}, //2. 펑크 {-1,-1}, //3. 펑크 {-1,-1}, //4. 펑크 {-1,-1}, //5. 펑크 {-1,-1} //6. 펑크 }, { //2:{2,2}, //1. 펑크 {6,6}, //2. 펑크 {-1,-1}, //3. 펑크 {-1,-1}, //4. 펑크 {-1,-1}, //5. 펑크 {-1,-1} //6. 펑크 }, ...
물론 여기에서는 모든 것이 가능합니다. 상상의 나래를 펼치십시오. 항상 전형적인 눈 이미지일 필요는 없습니다.
코드에서 직접 찾을 수 있는 기타 설명
어셈블리
우리는 Arduino를 일종의 방패로 소켓 스트립에 놓습니다. LED 매트릭스의 5개 접점은 동일한 방식으로 연결됩니다. Arduino가 중앙에 있으면 공간이 가장 잘 사용됩니다. 따라서 CS, CLK, DIN은 메트릭스용 핀 5, 6, 7을 사용하는 것이 가장 좋습니다. 여기에서는 솔더 포인트만 연결해야 합니다. 5V 및 GND에 대한 연결은 작은 점퍼를 통해 이루어집니다.
또한 두 개의 기울기 센서를 짧은 와이어로 연결합니다. 이들은 핀 2와 3, 5V 및 GND에 연결됩니다.
이제 모든 것을 조립할 수 있습니다. 플렉시 유리는 먼저 뜨거운 접착제로 고정됩니다. 우리는 LED 매트릭스와 동일한 작업을 수행합니다. 핫 글루의 작은 포인트로 충분합니다.
다음으로 온/오프 스위치를 설치하고 핫글루로 고정하고 적절한 전선에 연결합니다.
전원 공급 장치 장착
전원 공급 장치가 약간 땜질입니다. 가지고 있는 옵션과 구성 요소에 따라 플러스 및 마이너스 접점이 적절하게 맞춰질 수 있습니다.
우리는 사용한 배터리 구획에서 스프링과 핀을 사용합니다. 하우징 바닥에 부착하기 위해 와이어와 약간의 핫글루를 다시 사용합니다.
승압 부스트 컨버터는 대략적으로 조정하는 것이 가장 좋습니다. 설치 전 5V. 그러기 위해서는 저항을 약간 비틀어야 합니다.
그런 다음 대문자와 소문자가 합쳐집니다. 0.1mm의 맞춤으로 인해 추가 고정 없이 함께 연결하면 충분합니다. 그리고 배터리 교체를 위해 다시 열 수 있습니다.
그러면 끝입니다!
주사위 재미 2.0을 시작할 수 있습니다!
필요한 것 <울>
추가 정보
더 많은 정보를 원하시면 웹사이트 techpluscode.de/arduino-wuerfel-2-0을 확인하십시오.
죄송합니다 이 확장된 블로그는 독일어로만 제공됩니다;-)
섹션> <섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">/*Blog-Artikel:Schttel-Wrfel mit LED Matrix und Bewegungssimulationhttps://techpluscode.de/schuettel-wuerfel-mit-led-matrix-und-bewegungssimulation/techpluscode.deCopyright 2019 von Thomas Angielsky *///Bibliothek fr die Ansteuerung der 8x8 LED-Matrix einbinden//8x8 LED 매트릭스용 라이브러리 포함#include "LedControl.h"int PinTiltX =2; //핀 fr Tiltsensor Xint PinTiltY =3; //Pin fr Tiltsensor Y//Pins der LED-Matrix//LED 매트릭스의 핀 int PinCLK =7; int PinCS =6;int PinDIN =5;LedControl lc =LedControl(PinDIN, PinCLK, PinCS, 1);//LED 매트릭스의 좌표 좌표//LED 매트릭스의 주사위 포인트 좌표int DicePic[8][ 6][2] ={ { //행렬 행렬과 시작 위치:{9,9}, //1. 펑크 {9,8}, //2. 펑크 {9,7}, //3. 펑크 {9,6}, //4. 펑크 {9,5}, //5. 펑크 {9,4} //6. 펑크 }, { //1:{4,4}, //1. 펑크 {-1,-1}, //2. 펑크 {-1,-1}, //3. 펑크 {-1,-1}, //4. 펑크 {-1,-1}, //5. 펑크 {-1,-1} //6. 펑크 }, { //2:{2,2}, //1. 펑크 {6,6}, //2. 펑크 {-1,-1}, //3. 펑크 {-1,-1}, //4. 펑크 {-1,-1}, //5. 펑크 {-1,-1} //6. 펑크 }, { //3:{2,6}, //1. 펑크 {6,2}, //2. 펑크 {4,4}, //3. 펑크 {-1,-1}, //4. 펑크 {-1,-1}, //5. 펑크 {-1,-1} //6. 펑크 }, { //4:{2,2}, //1. 펑크 {2,6}, //2. 펑크 {6,2}, //3. 펑크 {6,6}, //4. 펑크 {-1,-1}, //5. 펑크 {-1,-1} //6. 펑크 }, { //5:{2,2}, //1. 펑크 {2,6}, //2. 펑크 {6,2}, //3. 펑크 {6,6}, //4. 펑크 {4,4}, //5. 펑크 {-1,-1} //6. 펑크 }, { //6:{2,1}, //1. 펑크 {2,4}, //2. 펑크 {2,7}, //3. 펑크 {6,1}, //4. 펑크 {6,4}, //5. 펑크 {6,7} //6. 펑크 }, { //시작:{-1,-1}, //1. 펑크 {-1,-1}, //2. 펑크 {-1,-1}, //3. 펑크 {-1,-1}, //4. 펑크 {-1,-1}, //5. 펑크 {-1,-1} //6. Punkt } };//Variablen der Wrfelaugen:Position, Richtung, Geschwindigkeit fr X 및 Y//주사위의 변수:위치, 방향, X 및 Y에 대한 속도float DiceXpos[6];float DiceXdir[6];휘발성 바이트 DiceXspeed[ 6];float DiceYpos[6];float DiceYdir[6];volatile byte DiceYspeed[6];int DiceValue;unsigned long timestamp;byte Mode;int volatileshakes;int ShakesPerSecond;int step;void InterruptChecks() { //Schttel -Anzahl zhlen // Count Shakesshakes=shakes+1; //Serial.println(밀리()); timestamp=millis();}void SetSpeedX() { if (Mode==0) { // alle Wrfel in X beschleunigen //X의 속도 증가 주사위 for (int i =0; i <6; i++) { if (DiceXspeed[i]<255) {DiceXspeed[i]=DiceXspeed[i]+5;} } } InterruptChecks();}void SetSpeedY() { if (Mode==0) { //Y beschleunigen의 모든 Wrpel / /(int i =0; i <6; i++) { if (DiceYspeed[i]<255) {DiceYspeed[i]=DiceYspeed[i]+5;} } } InterruptChecks(); }void ShowLed(int x, int y, bool onoff) {//LED nur anzeigen, wenn im sichtbaren Bereich//show only, when x/y in matrix if ((x<8) and (y<8) and ( x>=0) 및 (y>=0)) { lc.setLed(0, x, y, onoff); }}void ShowDot(int x, int y, bool onoff) {//Wrfel-Auge anzeigen oder ausblenden//주사위 포인트 표시 또는 숨기기 ShowLed(x-1, y-1, onoff); ShowLed(x, y-1, onoff); ShowLed(x-1, y, onoff); ShowLed(x, y, onoff);} void ShowDicePic(int 값) {//Wurf anzeigen//다이스부울 표시 완료; //모든 Punkte von der aktuellen Position aus zur Zielposition von DiceValue bewegen //모든 점을 현재 위치에서 DiceValue의 대상으로 이동 for (int i =0; i <6; i++) { DiceXspeed[i]=100; 주사위Y속도[i]=100; //Werte fr X berechnen //x 값 계산 DiceXdir[i]=0; if (int(DiceXpos[i])>DicePic[값][i][0]) {DiceXdir[i]=-1;} else if (int(DiceXpos[i])섹션>DicePic[값][i][1]) {DiceYdir[i]=-1;} else if (int(DiceYpos[i]) 7) { pos=7; 디렉토리=디렉토리*(-1); } if (pos<1) { pos=1; 디렉토리=디렉토리*(-1); } } // Geschwindigkeit wird pro Schritt langsamer // 속도는 단계마다 감소 if (sp> 0) {sp=sp-1;}}void MoveDots() { //alle Wrpel einen Schritt weiter bewegen //주사위 포인트를 한 단계 이동 더 나아가 for (int i =0; i <6; i++) { //새로운 좌표계산 //새로운 좌표계산 DoStep(DiceXpos[i],DiceXdir[i],DiceXspeed[i],true); DoStep(DiceYpos[i],DiceYdir[i],DiceYspeed[i],true); } //Wrpel-Augen anzeigen //주사위 포인트 표시 lc.clearDisplay(0); for (int i =0; i <6; i++) { ShowDot(int(DiceXpos[i]), int(DiceYpos[i]), true); } } void setup() { // MAX7219는 절전 모드를 시작하기 위해 시작되었습니다. //er muss aufgeweckt werden. //MAX7219는 시작 시 절전 모드에 있습니다. // 웨이크업 호출을 수행해야 합니다. lc.shutdown(0, false); //Helligkeit auf einen Mittelwert //밝기를 중간 값으로 설정 lc.setIntensity(0, 8); //디스플레이 lschen //디스플레이 지우기 lc.clearDisplay(0); randomSeed(analogRead(0)); 주사위 값 =0; for (int i =0; i <6; i++) { DiceXpos[i]=DicePic[7][i][0]; DiceYpos[i]=DicePic[7][i][1]; DiceXdir[i]=random(3)-1; DiceYdir[i]=random(3)-1; DiceXspeed[i]=random(126)+120; 주사위 속도[i]=random(126)+120; } //핀 einstellen //핀 설정 pinMode(PinTiltX, INPUT_PULLUP); 핀모드(핀틸트Y, INPUT_PULLUP); attachInterrupt(디지털PinToInterrupt(PinTiltX),SetSpeedX,CHANGE); attachInterrupt(digitalPinToInterrupt(PinTiltY),SetSpeedY,CHANGE); lc.clearDisplay(0); 타임스탬프=밀리(); 모드=1; 쇼다이스픽(6); 지연(1000); lc.clearDisplay(0); 모드=0; Serial.begin(9600); 단계=0; 셰이크=0;}무효 루프() { 지연(50); 단계=단계+1; if (step> 20) { //1 sek ist vorbei //1초가 멈췄습니다. step=0; ShakesPerSecond=흔들기; 흔들림=0; } if (모드==0) { MoveDots(); if (millis()-timestamp> 2000) { //seit 2 sek kein Schtteln mehr //2초 이후로 흔들림이 없음 Mode=1; DiceValue=무작위(6)+1; ShowDicePic(주사위 값); } } if (ShakesPerSecond>5) { //Es wird wieder geschttelt //다시 흔들기 Mode=0; }}
제조공정
구성품 및 소모품 Arduino Due http://www.arduino.cc에서 × 1 3.2 Arduino용 실드가 있는 TFT 400*240 SD 터치 모듈 마감 Elechouse의 것을 사용했습니다 × 1 RTC DS3231 Ebay의 실시간 시계 × 1 GPS 유블럭스 네오 6M Ebay의 GPS 모듈 × 1 Arduino용 PS2 조이스틱 Ebay에서 다시 × 1 DHT22 온도 센서 온도 및 습도 센서 × 1 HC-0
구성품 및 소모품 Arduino Mega 2560 × 1 Adafruit 2핀 LCD 디스플레이 × 1 24V 전원 공급 장치 × 1 Adafruit 힘 센서 × 1 팝 범퍼 어셈블리 × 1 팝 범퍼 스위치 × 1 대상 스위치 × 1 롤오버 스위치 × 1 플리퍼 어셈블리 × 1 LED 램프 × 1 이 프로젝트 정보 Arduino 제어 핀