Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Proyecto 2
Proyecto 2
Accidentes
400000
Abstract—This document will talk about the development
of safety systems for driver assistance, in the specific case, it 200000
is an alcohol detector and automatic braking by artificial 0
vision. 2013-2022
I. INTRODUCCIÓN
¿Qué es un detector de alcohol?
El Reglamento de Tránsito vigente en la Ciudad de
El Detector de Alcohol en Aliento ha sido propuesto para México, estipula en su artículo 50: queda prohibido
medir alcohol en aliento humano. Los resultados se utilizan en conducir vehículos motorizados cuando se tenga una
el diagnóstico de intoxicación por alcohol. El Detector de cantidad de alcohol en la sangre superior a 0.8 gramos por
Alcohol en Aliento es un examen rápido de filtrado semi- litro o de alcohol en aire espirado superior a 0.4
cuantitativo. Indica la relativa Concentración de Alcohol en la miligramos por litro, así como bajo el influjo de
Sangre (CAS) a niveles de corte 0.02%, 0.04%, 0.05%, 0.06%, narcóticos, estupefacientes o psicotrópicos al conducir.
0.08% ó 0.10. Cada detector contiene cristales que detectan un [5]
nivel específico de corte de CAS. El alcohol reacciona con los
cristales del detector produciéndose un cambio de color. El
Los conductores de vehículos destinados al servicio
cambio de color depende de la cantidad de alcohol en el
de transporte público de pasajeros, transporte escolar o de
aliento. Si el examen es positivo, la cantidad de alcohol en el
personal, vehículos de emergencia, de transporte de carga,
aliento será mayor o igual al nivel de corte del detector. [1]
no deben presentar ninguna cantidad de alcohol en la
¿Qué es la visión artificial? sangre o en aire espirado. [5]
En México, cada año mueren 24 mil personas en Fig.1. Sensor de gas MQ3.
accidentes automovilísticos relacionados con el consumo de
alcohol. México ocupa el 7º lugar mundial en muertes por esta El código utilizado con el Arduino Uno es el
causa. [4] siguiente:
TABLA I
ACCIDENTES DE TRANSITO EN LOS ÚLTIMOS 10
AÑOS.
void handleJpgHi() {
if
(!esp32cam::Camera.changeResolution(hiRes))
Fig.3. Calibración de mediciones (Arduino Uno). {
Serial.println("SET-HI-RES FAIL");
Ahora se procederá a probar los distintos tipos de
alcohol propuestos en los requisitos de la practica (etanol, }
cerveza, vodka, etc.). serveJpg();
}
Para la segunda parte del trabajo, el código utilizado
para el módulo ESP32-CAM es el siguiente:
#include <WiFi.h> void handleJpgMid() {
#include <esp32cam.h> //Download This if
Library: (!esp32cam::Camera.changeResolution(midRes)
) {
const char* WIFI_SSID = "Estudio"; //Set Your Serial.println("SET-MID-RES FAIL");
Wifi SSID/Name }
const char* WIFI_PASS = "00679794"; //Set serveJpg();
Your Wifi Password }
WebServer server(80);
void setup() {
Serial.begin(115200);
static auto loRes = Serial.println();
esp32cam::Resolution::find(320, 240); {
static auto midRes = using namespace esp32cam;
esp32cam::Resolution::find(350, 530); Config cfg;
static auto hiRes = cfg.setPins(pins::AiThinker);
esp32cam::Resolution::find(800, 600); cfg.setResolution(hiRes);
void serveJpg() { cfg.setBufferCount(2);
auto frame = esp32cam::capture(); cfg.setJpeg(80);
if (frame == nullptr) {
Serial.println("CAPTURE FAIL"); bool ok = Camera.begin(cfg);
server.send(503, "", ""); Serial.println(ok ? "CAMERA OK" :
return; "CAMERA FAIL");
} }
Serial.printf("CAPTURE OK %dx%d %db\n", WiFi.persistent(false);
frame->getWidth(), frame->getHeight(), WiFi.mode(WIFI_STA);
static_cast<int>(frame- WiFi.begin(WIFI_SSID, WIFI_PASS);
>size())); while (WiFi.status() != WL_CONNECTED) {
delay(500);
server.setContentLength(frame->size()); }
server.send(200, "image/jpeg"); Serial.print("http://");
WiFiClient client = server.client(); Serial.println(WiFi.localIP());
frame->writeTo(client); Serial.println(" /cam-lo.jpg");
} Serial.println(" /cam-hi.jpg");
Serial.println(" /cam-mid.jpg");
Serial.begin(9600); //Here Baudrate is
server.on("/cam-lo.jpg", handleJpgLo); Important. You need to set same baudrate in
server.on("/cam-hi.jpg", handleJpgHi); python program.
server.on("/cam-mid.jpg", handleJpgMid);
// configure the sensors
server.begin(); qtr.setTypeRC();
} qtr.setSensorPins((const uint8_t[]){ 13,
14, 27, 26, 25, 33 }, SensorCount);
void loop() { qtr.setEmitterPin(32);
server.handleClient();
} //output pin declare
pinMode(RPWM, OUTPUT);
Ahora el código utilizado para la tarjeta de desarrollo
ESP32 de 38 pines: pinMode(LPWM, OUTPUT);
#include <Arduino.h>
#include <QTRSensors.h> // Setup PWM channels
ledcSetup(R, 5000, 8); // Channel 0 for
QTRSensors qtr; Motor A, 5 kHz frequency, 8-bit resolution
ledcAttachPin(RPWM, R);
const uint8_t SensorCount = 6; ledcSetup(L, 5000, 8); // Channel 0 for
uint16_t sensorValues[SensorCount]; Motor A, 5 kHz frequency, 8-bit resolution
ledcAttachPin(LPWM, L);
const int trigPin = 15;
const int echoPin = 4; pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
//define sound speed in cm/uS pinMode(IN3, OUTPUT);
#define SOUND_SPEED 0.034 pinMode(IN4, OUTPUT);
#define CM_TO_INCH 0.393701
pinMode(trigPin, OUTPUT); // Sets the
long duration; trigPin as an Output
float distanceCm; pinMode(echoPin, INPUT); // Sets the
echoPin as an Input
//initial Speed of the Bot
int Speed = 160; digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
/*FOR RIGHT MOTOR*/
int RPWM = 5; digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
/*FOR LEFT MOTOR*/ }
int LPWM = 23;
int Sflag = 0; void loop() {
if (Serial.available() > 0) {
//declare channel for pwm Output
#define R 0 int angle = Serial.parseInt();
#define L 1 if (angle == 1) {
while (1) {
//Define in1/in2/in3/in4 pin int angle = Serial.parseInt();
int IN1 = 18; if (angle == 2) break;
int IN2 = 19; stop();
int IN3 = 21; }
int IN4 = 22; } else {
lfr();
int threshold = 1000; }
} else {
void setup() { lfr();
} if (sensorValues[2] > threshold ||
} sensorValues[3] > threshold) break;
void lfr() { }
} else if (sensorValues[1] > threshold)
// Clears the trigPin {
digitalWrite(trigPin, LOW); //Serial.println("lfr");
delayMicroseconds(2); ledcWrite(R, 0);
// Sets the trigPin on HIGH state for 10 ledcWrite(L, 170);
micro seconds
digitalWrite(trigPin, HIGH); digitalWrite(IN1, HIGH);
delayMicroseconds(10); digitalWrite(IN2, LOW);
digitalWrite(trigPin, LOW);
digitalWrite(IN3, HIGH);
// Reads the echoPin, returns the sound wave digitalWrite(IN4, LOW);
travel time in microseconds } else if (sensorValues[4] > threshold)
duration = pulseIn(echoPin, HIGH); {
//Serial.println("lfr");
// Calculate the distance ledcWrite(R, 170);
distanceCm = duration * SOUND_SPEED / 2; ledcWrite(L, 0);
read();
digitalWrite(IN1, HIGH);
if (distanceCm <= 20) { digitalWrite(IN2, LOW);
stop();
delay(2000); digitalWrite(IN3, HIGH);
} else { digitalWrite(IN4, LOW);
if (sensorValues[0] > threshold) { } else if (sensorValues[2] > threshold
while (1) { || sensorValues[3] > threshold) {
//Serial.println("lfr"); //Serial.println("lfr");
ledcWrite(R, 200); ledcWrite(R, Speed);
ledcWrite(L, 200); ledcWrite(L, Speed);
-
Fig.9. Código en Python IDLE para el ESP32 y ESP32-CAM.
III. RESULTADOS
Para el detector de alcohol se tiene lo siguiente: