Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Système de contrôle intelligent des feux de circulation avec données en temps réel

Composants et fournitures

Arduino Yun × 1
Arduino UNO (ou toute autre carte Arduino) × 1
Capteur ultrasonique HC-SR04 × 1
Module RTC DS3231 (Horloge temps réel) × 1
LED (1 rouge, 1 jaune, 1 verte) × 3
Résistance 330 Ω × 3
Modules RF 433 MHz (1 émetteur, 1 récepteur) × 1
Appareil Android × 1
Carte SD × 1
Kit de développement rapide AllThingsTalk IOTOPIA × 1
Fils de connexion × 1

Applications et services en ligne

À propos du projet

Introduction

La circulation a le don d'exaspérer les plus patients d'entre nous, et la situation ne fait qu'empirer. Et si des feux de circulation intelligents pouvaient changer la donne ? Nous avons créé un système d'information sur les feux de circulation qui indique au conducteur à quelle vitesse il doit rouler pour atteindre le carrefour et passer au vert sans dépasser la limitation de vitesse. Et lorsque le conducteur doit inévitablement s'arrêter au rouge, le système lui indique quand le feu passera au vert.

Système de contrôle intelligent des feux de circulation avec données en temps réel

Un feu de circulation envoie des données sur la durée du vert ou le temps avant le prochain vert vers une base de données en ligne. Une application GPS ou smartphone récupère ces données et calcule la vitesse idéale pour passer au vert. Elle affiche aussi le temps d'attente restant lorsque l'arrêt est inévitable.

Exemple

Vous roulez dans une zone limitée à 70 km/h, en respectant la limite. Le feu devant vous est rouge et passera au vert dans 30 secondes. Vous êtes à 500 mètres du feu, le système vous recommandera donc de rouler à 60 km/h.

Système de contrôle intelligent des feux de circulation avec données en temps réel

Démonstration du projet

Comment nous l'avons réalisé

Pour démontrer notre projet, nous avons créé un feu de circulation avec l'Arduino Yun. Il se compose de 3 LEDs et d'une horloge temps réel (RTC). Les feux changent à intervalles réguliers. L'Arduino Yun enregistre les heures de passage au vert/rouge, puis exécute un script PHP qui se connecte à la base de données MySQL en ligne pour y insérer les données. Une application Android (créée avec Android Studio) récupère ces données via un autre script PHP qui renvoie les données du feu au format JSON. L'application calcule la vitesse recommandée et affiche un compte à rebours quand le passage au vert est impossible.

Système de contrôle intelligent des feux de circulation avec données en temps réel

Pour calculer la vitesse idéale, l'application doit connaître la distance au feu. Cela se fait normalement par coordonnées GPS, mais la précision du GPS d'un smartphone est insuffisante à notre échelle. Nous avons donc utilisé un module ultrasonique HC-SR04. L'Arduino Yun reçoit la distance entre la voiture et le feu via des modules RF 433 MHz. À chaque nouvelle mesure, il met à jour la base de données, permettant à l'application de calculer la vitesse recommandée.

Système de contrôle intelligent des feux de circulation avec données en temps réel

Instructions

  1. Créer une base de données MySQL en ligne (nous avons utilisé freemysqlhosting.net)
  2. Ajouter une table 'TrafficL_data' à la base de données
  3. Configurer le matériel (émetteur) - Voir le schéma 'Arduino émetteur'
  4. Téléverser le code 'Arduino Transmitter Code' sur l'Arduino
  5. Connecter l'Arduino Yun à votre réseau WiFi
  6. Accéder au serveur Linux de l'Arduino Yun via Putty :
    opkg update
    opkg install php5-mod-mysqli
    opkg install php5-cli
    nano /mnt/sda1/MySQL_UpdateTrafficLData.php
    
    Si l'erreur '-ash: nano: not found' apparaît, installer nano : opkg install nano
    chmod 755 /mnt/sda1/MySQL_UpdateTrafficLData.php
    /mnt/sda1/MySQL_UpdateTrafficLData.php
    nano /mnt/sda1/MySQL_UpdateDistance.php
    chmod 755 /mnt/sda1/MySQL_UpdateDistance.php
    /mnt/sda1/MySQL_UpdateDistance.php
    
  7. Configurer le matériel (récepteur Arduino Yun) - Voir le schéma 'Arduino Yun récepteur'
  8. Téléverser 'Arduino Receiver & MySQLdb' sur l'Arduino Yun
  9. Ouvrir le moniteur série - Vous devriez voir les données de mise à jour
  10. Fichiers Android Studio : activity_main.xml, MainActivity.java, AndroidManifest.xml, strings.xml (n'oubliez pas de modifier l'URL)
  11. Téléverser le projet Android Studio sur votre smartphone

Instructions pour ESP8266 [Alternative]

Il est possible d'utiliser un module ESP8266 au lieu de l'Arduino Yun plus coûteux :

  1. Créer un compte sur 000webhost.com
  2. Créer un site web
  3. Créer une nouvelle base de données
  4. Téléverser 'CreateTable.php' et 'PostDemo.php' via le gestionnaire de fichiers. Modifier 'username', 'password' et 'dbname' dans les deux fichiers.
  5. Créer la table : sélectionner 'CreateTable.php' et cliquer sur 'view'
  6. Installer les packages ESP8266 dans Arduino IDE : ajouter l'URL https://arduino.esp8266.com/stable/package_esp8266com_index.json dans Fichier → Préférences
  7. Sélectionner votre carte, port COM... et téléverser ESP8266PostDemo.ino

Note de mise à jour (9 février 2019) : Le code a été modifié pour mettre à jour la base de données toutes les 10 secondes avec des valeurs aléatoires, faute de module RTC disponible.

Code

Arduino Transmitter Code

/* IOTOPIA - 2016-2017 - Système d'information feu de circulation (Émetteur)
 * par Pieter Luyten & Joppe Smeets
 * Envoie la distance vers un autre Arduino via modules RF 433MHz
 * RF 433MHz : tx_pin --> pin 3
 * HC-SR04 : trig_pin --> pin 5, echo_pin --> pin 6
 */
#define tx_pin 3
#define trig_pin 5
#define echo_pin 6
#include <VirtualWire.h>
#include "HCSR04.h"
HCSR04 ultrasonic(trig_pin,echo_pin);
int distance;
char CharMsg[21];

void setup() {
  Serial.begin(9600);
  vw_setup(2000);
  vw_set_tx_pin(tx_pin);
}

void loop() {
  distance = ultrasonic.Ranging(CM);
  while(distance < 0) {
    distance = ultrasonic.Ranging(CM);
  }
  sprintf(CharMsg, "%d,", distance);
  vw_send((uint8_t *)CharMsg, strlen(CharMsg));
  vw_wait_tx();
  Serial.print("Distance (cm): ");
  Serial.println(distance);
  delay(250);
}

Arduino Receiver & MySQLdb

/* IOTOPIA - 2016-2017 - Système d'information feu de circulation (Récepteur + Upload MySQL)
 * par Pieter Luyten & Joppe Smeets
 * Reçoit la distance via RF, téléverse données feu et distance vers MySQL
 */
#define RedLED 5
#define OrangeLED 6
#define GreenLED 7
#define rx_pin 9
#include <VirtualWire.h>
#include <TimeAlarms.h>
#include <Wire.h>
#include "RTClib.h"
#include <Process.h>

long UnixTime_green_1, UnixTime_red_1, UnixTime_green_2, UnixTime_red_2;
long s_till_orange;
RTC_DS3231 rtc;
char StringReceived[22];
boolean i;
int interval = 5;
int distance;

void setup() {
  rtc.begin();
  Serial.begin(9600);
  Bridge.begin();
  vw_setup(2000);
  vw_set_rx_pin(rx_pin);
  vw_rx_start();
  Alarm.timerRepeat(interval, UpdateTrafficLData);
  Alarm.timerRepeat(1, PrintCurrentTime);
  pinMode(GreenLED, OUTPUT);
  pinMode(OrangeLED, OUTPUT);
  pinMode(RedLED, OUTPUT);
  digitalWrite(GreenLED, LOW);
  digitalWrite(OrangeLED, LOW);
  digitalWrite(RedLED, LOW);
  Serial.println("Setup finished");
}

void loop() {
  Alarm.delay(0);
  RF_Listen();
}

void RF_Listen() {
  uint8_t buf[VW_MAX_MESSAGE_LEN];
  uint8_t buflen = VW_MAX_MESSAGE_LEN;
  if (vw_get_message(buf, &buflen)) {
    int a;
    for (a = 0; a < buflen; a++) {
      StringReceived[a] = char(buf[a]);
    }
    sscanf(StringReceived, "%d", &distance);
    MySQL_UpdateDistance();
    Serial.print("Distance: ");
    Serial.println(distance);
  }
  memset(StringReceived, 0, sizeof(StringReceived));
}

void UpdateTrafficLData() {
  DateTime now = rtc.now();
  if (i == 1) {
    UnixTime_green_1 = now.unixtime() + interval + 1;
    UnixTime_red_1 = now.unixtime() + 2 * interval + 1;
    UnixTime_green_2 = now.unixtime() + 3 * interval + 1;
    UnixTime_red_2 = now.unixtime() + 4 * interval + 1;
    MySQL_UpdateTrafficLData();
    i = 0;
  } else {
    UnixTime_red_1 = now.unixtime() + interval + 1;
    UnixTime_green_1 = now.unixtime() + (2 * interval) + 1;
    UnixTime_red_2 = now.unixtime() + 3 * interval + 1;
    UnixTime_green_2 = now.unixtime() + 4 * interval + 1;
    MySQL_UpdateTrafficLData();
    i = 1;
  }
  Serial.print(" Green_1 at ");
  Serial.print(UnixTime_green_1);
  Serial.print(" Red_1 at ");
  Serial.print(UnixTime_red_1);
  Serial.print(" Green_2 at ");
  Serial.print(UnixTime_green_2);
  Serial.print(" Red_2 at ");
  Serial.println(UnixTime_red_2);
}

void MySQL_UpdateTrafficLData() {
  long dataArray[4] = {UnixTime_green_1, UnixTime_red_1, UnixTime_green_2, UnixTime_red_2};
  Process p;
  p.begin("/mnt/sda1/MySQL_UpdateTrafficLData.php");
  for (int b = 0; b < 4; b++) {
    p.addParameter(String(dataArray[b]));
  }
  p.run();
  while (p.available() > 0) {
    char c = p.read();
    Serial.print(c);
  }
  Serial.flush();
}

void MySQL_UpdateDistance() {
  Process p;
  p.begin("/mnt/sda1/MySQL_UpdateDistance.php");
  p.addParameter(String(distance));
  p.run();
  while (p.available() > 0) {
    char c = p.read();
    Serial.print(c);
  }
  Serial.flush();
}

void PrintCurrentTime() {
  DateTime now = rtc.now();
  SetLEDsTrafficL();
  Serial.print(now.hour(), DEC);
  Serial.print(':');
  Serial.print(now.minute(), DEC);
  Serial.print(':');
  Serial.print(now.second(), DEC);
  Serial.print(" ");
  Serial.println(now.unixtime());
}

void SetLEDsTrafficL() {
  DateTime now = rtc.now();
  s_till_orange = UnixTime_red_1 - now.unixtime();
  if (i == 0) {
    digitalWrite(GreenLED, LOW);
    digitalWrite(OrangeLED, LOW);
    digitalWrite(RedLED, HIGH);
  }
  if (i == 1 && s_till_orange <= 3) {
    digitalWrite(GreenLED, LOW);
    digitalWrite(OrangeLED, HIGH);
    digitalWrite(RedLED, LOW);
  }
  if (i == 1 && s_till_orange > 3) {
    digitalWrite(GreenLED, HIGH);
    digitalWrite(OrangeLED, LOW);
    digitalWrite(RedLED, LOW);
  }
}

MySQL_UpdateTrafficLData.php

#!/usr/bin/php-cli
<?php
$UnixTime_green_1 = $argv[1];
$UnixTime_red_1 = $argv[2];
$UnixTime_green_2 = $argv[3];
$UnixTime_red_2 = $argv[4];
$DBServer = 'yourServerName';
$DBUser = 'yourUserName';
$DBPass = 'yourPassword';
$DBName = 'yourDBName';
$conn = new mysqli($DBServer, $DBUser, $DBPass, $DBName);
if ($conn->connect_error) {
  trigger_error('Database connection failed: ' . $conn->connect_error, E_USER_ERROR);
}
$sql = "UPDATE TrafficL_data SET UnixTime_green_1='$UnixTime_green_1', UnixTime_red_1='$UnixTime_red_1', UnixTime_green_2='$UnixTime_green_2', UnixTime_red_2='$UnixTime_red_2' WHERE id=1";
if ($conn->query($sql) === false) {
  trigger_error('Wrong SQL: ' . $sql . ' Error: ' . $conn->error, E_USER_ERROR);
} else {
  echo "Data inserted!\n";
}
?>

MySQL_UpdateDistance.php

#!/usr/bin/php-cli
<?php
$Distance = $argv[1];
$DBServer = 'yourServerName';
$DBUser = 'yourUserName';
$DBPass = 'yourPassword';
$DBName = 'yourDBName';
$conn = new mysqli($DBServer, $DBUser, $DBPass, $DBName);
if ($conn->connect_error) {
  trigger_error('Database connection failed: ' . $conn->connect_error, E_USER_ERROR);
}
$sql = "UPDATE TrafficL_data SET Distance='$Distance' WHERE id=1";
if ($conn->query($sql) === false) {
  trigger_error('Wrong SQL: ' . $sql . ' Error: ' . $conn->error, E_USER_ERROR);
} else {
  echo "Distance inserted!\n";
}
?>

EchoJSON.php

<?php
define('HOST', 'yourServerName');
define('USER', 'yourUserName');
define('PASS', 'yourPassword');
define('DB', 'yourDBName');
$con = mysqli_connect(HOST, USER, PASS, DB);
$sql = "select * from TrafficL_data";
$res = mysqli_query($con, $sql);
while ($row = mysqli_fetch_array($res, MYSQLI_BOTH)) {
  printf('[ { "TrafficLArray": [ { "UnixTime_green_1":"%s", "UnixTime_red_1":"%s", "UnixTime_green_2":"%s", "UnixTime_red_2":"%s", "Distance":"%s" } ] } ]',
    $row['UnixTime_green_1'], $row['UnixTime_red_1'], $row['UnixTime_green_2'], $row['UnixTime_red_2'], $row['Distance']);
}
mysqli_close($con);
?>

MainActivity.java (extrait)

package com.example.xxx.xxx;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonArrayRequest;
import com.android.volley.toolbox.Volley;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.Date;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class MainActivity extends AppCompatActivity {
  TextView results, recSpeed;
  String JsonURL = "YourURLhere";
  RequestQueue requestQueue;
  private final static double maxSpeed = 18; // cm/s
  private double speed;
  public final static int NUMBER_OF_ENTRIES = 2;
  long[] unixTimesGreen = new long[NUMBER_OF_ENTRIES];
  long[] unixTimesRed = new long[NUMBER_OF_ENTRIES];
  private double distance;
  private final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
  private Future<?> timingTask;

  public void tick(long milliseconds) {
    timingTask = scheduler.scheduleAtFixedRate(new Runnable() {
      public void run() { updateTable(); }
    }, 0, milliseconds, TimeUnit.MILLISECONDS);
  }

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    results = (TextView) findViewById(R.id.jsonData);
    recSpeed = (TextView) findViewById(R.id.recommendedSpeed);
    updateTable();
    tick(500);
  }
  // ... méthodes updateTable(), updateTextView(), speedCalc() ...
}

Schémas

Émetteur : RF 433MHz tx_pin → pin 3 | HC-SR04 trig_pin → pin 5, echo_pin → pin 6

Récepteur : RF 433MHz rx_pin → pin 3 | LEDs : Rouge pin 5, Orange pin 6, Vert pin 7 | DS3231 SCL → SCL (pin 3 Yun), SDA → SDA (pin 2 Yun)

Processus de fabrication

  1. Les lanternes à gaz : évolution, conception et fabrication moderne
  2. Pointeur laser : conception, fabrication et aperçu de la sécurité
  3. Le kaléidoscope : de la science de Brewster au design moderne
  4. Feux de signalisation : ingénierie, histoire et innovations futures
  5. Diodes Électroluminescentes (DEL) : De l'Inception aux Durées de Vie de 100 Ans
  6. À l'intérieur d'une ampoule LED connectée Sengled : démontage technique et analyse Zigbee
  7. Feu de circulation intelligent : Éclairage public adaptatif alimenté par l'IoT
  8. Contrôle feux de route piloté par IA : meilleure vision nocturne sans éblouissement
  9. Maîtriser les accessoires pour bandeaux LED : connecter, contrôler, personnaliser