Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Ultrasonische Ogen: Interactieve 8x8 LED-matrix Afstandssensor

Onderdelen en benodigdheden

Ultrasonische Sensor - HC-SR04 (Generiek) 2
Arduino Nano R3 1
Fotoweerstand (LDR) 1
Maxim Integrated 8x8 LED-matrix MAX7219 2
Solderloos Breadboard Half Formaat 1
Jumper wires (generiek) 1
Weerstand 330 ohm 1

Apps en online diensten

Arduino IDE

Over dit project

Ik wilde een knutselproject maken met 8x8 LED-matrices en ultrasonische sensoren... iets anders dan wat mensen meestal met ultrasonics maken. En het moest leuk en speels zijn.

Dus ik creëerde wat ik UltrasonicEyes noem - een leuk project dat je ergens neerzet waar mensen rondlopen. Het kijkt omher naar waar mensen zijn, knippert, en ja, het is gewoon op een leuke en griezelige manier weird!

Wat hebben we nodig?

Ultrasonische sensormodules zijn ontworpen om obstakels te detecteren en de afstand te bepalen. Ze hebben doorgaans een detectiebereik van 3-4 meter, wat een goede afstand is voor dit project in een woonkamer of kantoor.

Ultrasonische Ogen: Interactieve 8x8 LED-matrix Afstandssensor

Ik gebruik 2x HC-SR04 modules van eBay. Ze zijn supergoedkoop. De modules zijn eenvoudig te gebruiken en vereisen slechts 3 of 4 draden voor verbinding met een Arduino.

De 8x8 LED-matrix modules die ik koos ondersteunen koppeling, dus hoeft er maar één aan de Arduino verbonden te worden; de tweede koppelt aan de eerste.

Ultrasonische Ogen: Interactieve 8x8 LED-matrix Afstandssensor

De modules gebruiken SPI, dus we hebben slechts 5 draden naar de Arduino nodig om oogafbeeldingen op beide displays te besturen. Natuurlijk hebben we er twee nodig!

LET OP: De meegeleverde code gebruikt Hardware SPI. Als je een ander Arduino-board dan de Nano gebruikt, check welke pinnen Hardware SPI-pinnen zijn voor MOSI en SCK en wire ze dienovereenkomstig!

Ultrasonische Ogen: Interactieve 8x8 LED-matrix Afstandssensor

Je hebt ook een Arduino-compatibele microcontroller nodig. Ik gebruik een Nano (compatibel) omdat het klein genoeg is voor de behuizing, USB heeft voor voeding/programmeren en voldoende GPIO's.

Ultrasonische Ogen: Interactieve 8x8 LED-matrix Afstandssensor

Ik heb alles op een printplaatje gesoldeerd van de grootte van een half breadboard, maar ik raad aan om eerst alles op een half breadboard te bouwen. Geen solderen nodig en makkelijk aan te passen.

De laatste dingen: een LDR (fotoweerstand) voor lichtdetectie, een 330-ohm weerstand en een boel breadboard-draden (male-female en female-female).

LET OP: Je kunt elke kleur draad gebruiken... er is geen eis om dezelfde kleuren te gebruiken als ik specificeer, maar, het is goede gewoonte om rood en zwart te gebruiken voor VOEDING en GND, en andere kleuren voor data & signalen. Dit maakt het super makkelijk om te zien welke draden stroom voeren.

Alles aan elkaar knopen

POWER en GND verbindingen

Plaats de Nano aan het einde van het breadboard zodat de USB over de rand steekt, maar alle pinnen nog in zitten. Verbind een zwarte draad van GND op de Nano naar de GND-rail op het breadboard. Doen hetzelfde met een rode draad van 3V (of 5V als dat je hebt) naar de POWER-rail.

Ultrasonische Ogen: Interactieve 8x8 LED-matrix Afstandssensor

Verbind ook de twee GND-rails met elkaar (zwarte draad) en de twee POWER-rails (rode draad).

*Opmerking: Sommige matrix LED-panelen hebben 5V nodig in plaats van 3,3V, afhankelijk van het merk. Als je onbetrouwbare resultaten krijgt, probeer dan de 5V-pin van de Arduino.

Ultrasonische sensoren aansluiten

Verbind zwarte draden van GND op beide sensoren naar GND-rail. Rode draden van VCC naar POWER-rail.

Ultrasonische Ogen: Interactieve 8x8 LED-matrix Afstandssensor

Nu de signaaldraden (wit = TRIG, blauw = ECHO):

  • Wit: TRIG sensor 1 → Digitale pin 2 Arduino
  • Blauw: ECHO sensor 1 → Digitale pin 3 Arduino
  • Wit: TRIG sensor 2 → Digitale pin 4 Arduino
  • Blauw: ECHO sensor 2 → Digitale pin 5 Arduino

Twee 8x8 LED-matrix displays verbinden

Zwarte draad: inkomende GND display 1 → GND-rail. Rode draad: inkomende VCC display 1 → POWER-rail.

Ultrasonische Ogen: Interactieve 8x8 LED-matrix Afstandssensor

Verbind uitgaande GND display 1 → inkomende GND display 2. Hetzelfde voor VCC.

Tussen de twee displays:

  • Geel: uitgaande SCK (Clock) display 1 → inkomende SCK display 2
  • Blauw: uitgaande MOSI (Data) display 1 → inkomende MOSI display 2
  • Wit: uitgaande CS (Select) display 1 → inkomende CS display 2

Rest van display 1 naar Arduino:

  • Geel: inkomende SCK display 1 → Digitale pin 13 Arduino
  • Blauw: inkomende MOSI display 1 → Digitale pin 11 Arduino
  • Wit: inkomende CS display 1 → Digitale pin 10 Arduino

ONTHOUD: De code gebruikt Hardware SPI. Check bij andere boards welke pinnen Hardware SPI zijn voor MOSI en SCK!

LDR en weerstand aansluiten voor omgevingslichtdetectie

Waarom doen we dit? De LDR laat ons detecteren of het licht of donker is om de helderheid van de LED-displays aan te passen. 's Nachts hoeven ze niet superhelder (30% volstaat), maar overdag in een lichte kamer moeten ze harder branden.

Ultrasonische Ogen: Interactieve 8x8 LED-matrix Afstandssensor

Plaats de LDR over 2 rijen pinnen op het breadboard. Plaats de 330-ohm weerstand tussen één rij aan de ene kant van de LDR en de GND-rail. Rode draad tussen de andere rij van de LDR en de POWER-rail. Tenslotte een bruine draad tussen de rij waar de weerstand zit en Analoge pin 5 (A5) op de Arduino. Het moet een analoog pin zijn omdat we een waarde 0-255 willen lezen (lichtsterkte) in plaats van 0/1.

Opstarten en code uploaden

Dat is het, we zijn aangesloten. USB-kabel in de Arduino en computer, upload de UltrasonicEyes-sketch en kijk wat er gebeurt! Loop voor de sensoren of beweeg met je handen.

Wil je het permanent maken?

Bekijk mijn video over het overgaan van breadboard naar printplaat. Print de 2 delen van de behuizing op een 3D-printer en monteer zoals in de video. Ik werk ook aan een capacitieve touch-knop (of gewone knop) om door verschillende oogvormen te cyclen. Volg me op Twitter, Facebook, Instagram & Tindie: https://www.patreon.com/unexpectedmaker

Code

Ultrasonic Eyes

#include <MD_MAX72xx.h> // Voor besturing 8x8 LED-matrix - installeer via Library Manager
#include <NewPing.h>    // Voor ultrasonische sensoren - installeer via Library Manager

// Pinnen voor LED-matrix display 1
//#define CLK_PIN 13  // Hardware SPI - zorg dat CLP op hardware CLK-pin zit
//#define DATA_PIN 11 // Hardware SPI - zorg dat MOSI op hardware MOSI-pin zit
#define CS_PIN 10     // Chip Select pin
#define MAX_DEVICES 2 // Aantal displays - we hebben 2 nodig, één per oog
#define LIGHT A5      // Analoge pin 5 voor LDR-waarde

// Hardware SPI initialisatie
MD_MAX72XX mx = MD_MAX72XX(CS_PIN, MAX_DEVICES);

#define t1 2 // Trigger pin Ultrasonische Sensor 1
#define e1 3 // Echo pin Ultrasonische Sensor 1
#define t2 4 // Trigger pin Ultrasonische Sensor 2
#define e2 5 // Echo pin Ultrasonische Sensor 2
#define maxDist 400 // Max afstand voor ultrasonische puls

NewPing eyeR(t2, e2, maxDist); // Initialiseer sensor 2 (rechts)
NewPing eyeL(t1, e1, maxDist); // Initialiseer sensor 1 (links)

// Huidige systeemstaat
// 0: Recht vooruit kijken
// 1: Naar rechts kijken
// 2: Naar links kijken
int currentState = -1;

long duration1, duration2;
int distance1, distance2;

float nextBlink = millis() + 1000; // Volgende willekeurige knipper
float lightAmount = 0;           // Huidige lichtintensiteit

// Oogpatronen (8x8 kolommen)
uint8_t eye_forward[COL_SIZE] = {
  0b00111100, 0b01000010, 0b01011010, 0b10101101,
  0b10111101, 0b10011001, 0b01000010, 0b00111100
};
uint8_t eye_right[COL_SIZE] = {
  0b00111100, 0b01000010, 0b01110010, 0b11011001,
  0b11111001, 0b10110001, 0b01000010, 0b00111100
};
uint8_t eye_left[COL_SIZE] = {
  0b00111100, 0b01000010, 0b01001110, 0b10010111,
  0b10011111, 0b10001101, 0b01000010, 0b00111100
};
uint8_t eye_blink[COL_SIZE] = {
  0b00000000, 0b00111100, 0b01111110, 0b11111111,
  0b10111101, 0b11000011, 0b01111110, 0b00111100
};

void setup() {
  mx.begin();
  pinMode(t1, OUTPUT); pinMode(e1, INPUT);
  pinMode(t2, OUTPUT); pinMode(e2, INPUT);
  digitalWrite(t1, LOW); digitalWrite(t2, LOW);
  pinMode(LIGHT, INPUT);
  ShowEye_Forward();
  currentState = 0;
}

void loop() {
  lightAmount = analogRead(LIGHT);
  lightAmount = (lightAmount / 255.0) * MAX_INTENSITY;
  mx.control(MD_MAX72XX::INTENSITY, lightAmount);
  
  distance1 = eyeL.ping_median(5);
  delay(500);
  distance2 = eyeR.ping_median(5);
  
  // Willekeurige knipper check
  if (nextBlink < millis()) {
    nextBlink = millis() + random(2000, 10000);
    if (random(1, 13) <= 6)
      ShowEye_Blink_Dbl();
    else
      ShowEye_Blink();
    delay(250);
    return;
  }
  
  float difference = (distance2 - distance1);
  if (abs(difference) < 250 || (distance1 == 0 && distance2 == 0)) {
    ShowEye_Forward();
    currentState = 0;
  } else if (distance2 < distance1 && distance1 > 0) {
    ShowEye_Right();
    currentState = 1;
  } else if (distance1 < distance2 && distance2 > 0) {
    ShowEye_Left();
    currentState = 2;
  }
  delay(250);
}

void ShowEye_Right() {
  mx.clear();
  mx.control(MD_MAX72XX::INTENSITY, lightAmount);
  for (uint8_t row = 0; row < ROW_SIZE; row++) {
    mx.setColumn(row, eye_right[row]);
    mx.setColumn(row + 8, eye_right[row]);
  }
}

void ShowEye_Left() {
  mx.clear();
  mx.control(MD_MAX72XX::INTENSITY, lightAmount);
  for (uint8_t row = 0; row < ROW_SIZE; row++) {
    mx.setColumn(row, eye_left[row]);
    mx.setColumn(row + 8, eye_left[row]);
  }
}

void ShowEye_Forward() {
  mx.clear();
  mx.control(MD_MAX72XX::INTENSITY, lightAmount);
  for (uint8_t row = 0; row < ROW_SIZE; row++) {
    mx.setColumn(row, eye_forward[row]);
    mx.setColumn(row + 8, eye_forward[row]);
  }
}

void ShowEye_Blink() {
  mx.clear();
  mx.control(MD_MAX72XX::INTENSITY, lightAmount);
  for (uint8_t row = 0; row < ROW_SIZE; row++) {
    mx.setColumn(row, eye_blink[row]);
    mx.setColumn(row + 8, eye_blink[row]);
  }
  delay(150);
  if (currentState == 0) ShowEye_Forward();
  else if (currentState == 1) ShowEye_Right();
  else if (currentState == 2) ShowEye_Left();
}

void ShowEye_Blink_Dbl() {
  mx.clear();
  mx.control(MD_MAX72XX::INTENSITY, lightAmount);
  for (uint8_t row = 0; row < ROW_SIZE; row++) {
    mx.setColumn(row, eye_blink[row]);
    mx.setColumn(row + 8, eye_blink[row]);
  }
  delay(75);
  if (currentState == 0) ShowEye_Forward();
  else if (currentState == 1) ShowEye_Right();
  else if (currentState == 2) ShowEye_Left();
  delay(75);
  ShowEye_Blink();
}

Aangepaste onderdelen en behuizingen

Print met elke 3D-printer, geen specifieke instellingen vereist.

Schema's

Ultrasonische Ogen: Interactieve 8x8 LED-matrix Afstandssensor ultrasoniceyes_final_Th84xpUyB2.fzz

Productieproces

  1. Bouw je eigen UFO Attack Game met Arduino UNO & MAX7219 Display
  2. Slimme Jaloezieën: Geautomatiseerd Lichtbeheer met Arduino & Zonne-energie
  3. 3D RGB Arduclock – Bluetooth LED Tijdstuk met Real-Time Clock
  4. Riviergezondheidsmonitor: Arduino-gebaseerd Waterkwaliteitssysteem
  5. Een Arduino Iron Man bouwen: onderdelen, sensoren en stapsgewijze handleiding
  6. Een eenvoudige obstakelsensor bouwen met Arduino – IR LED & Fotodiodo Tutorial
  7. Interactieve Joystick Game met Arduino en LED Feedback
  8. Find Me: Slimme Item Locator met Arduino en Bluetooth
  9. DIY Arduino Luchtbevochtiger Controller met Relais – Veilige Hoogspanningsopstelling
  10. Arduino-aangedreven mini-rover: Bouw je eigen autonome robot
  11. Bouw een Aangepaste Arduino Joystick Stuurwiel voor Gaming