Practica1 CarroControlWifi
Practica1 CarroControlWifi
Práctica 1
Correo: [email protected]
Sección: D06
29 de octubre de 2024
Introducción
Este proyecto presenta el desarrollo de un sistema móvil con dos ruedas motrices y una rueda adicional de
soporte, controlado por un microcontrolador ESP32-S3 junto con un módulo L298N para la gestión de motores.
La programación del ESP32S se realizó en Arduino, su configuración se realizó mediante una interfaz gráfica
creada en QTCreator. La comunicación entre el microcontrolador y la interfaz se estableció mediante WiFi. Esta
propuesta ofrece una solución funcional y práctica para la movilidad y operación a distancia.
Materiales:
Procedimiento y resultados:
Diagrama de la conexión
Implementación en físico
Programación:
Código en Arduino:
#include "BluetoothSerial.h"
#include <WiFi.h>
#include <ESPmDNS.h>
#include <WiFiClient.h>
#include <ArduinoJson.h>
#include <EEPROM.h>
#include "esp_system.h"
#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>
#define SERVICE_UUID "7271d0aa-81d1-4c4d-aa45-2eaf95d2c7dd" // UART service UUID
#define CHARACTERISTIC_UUID_RX "7271d0ab-81d1-4c4d-aa45-2eaf95d2c7dd"
#define CHARACTERISTIC_UUID_TX "7271d0ac-81d1-4c4d-aa45-2eaf95d2c7dd"
WiFiServer servidor(80);
void pararMotor(){
digitalWrite(motor1A, 0);
digitalWrite(motor1B, 0);
digitalWrite(motor2A, 0);
digitalWrite(motor2B, 0);
}
void configurarMotores(){
pinMode(motor1A, OUTPUT);
pinMode(motor1B, OUTPUT);
pinMode(motor2A, OUTPUT);
pinMode(motor2B, OUTPUT);
pararMotor();
}
void motoresIzquierda(){
digitalWrite(motor1A, HIGH);
digitalWrite(motor1B, LOW);
digitalWrite(motor2A, HIGH);
digitalWrite(motor2B, LOW);
}
void motoresDerecha(){
digitalWrite(motor1A, LOW);
digitalWrite(motor1B, HIGH);
digitalWrite(motor2A, LOW);
digitalWrite(motor2B, HIGH);
}
void motoresAdelante(){
digitalWrite(motor1A, HIGH);
digitalWrite(motor1B, LOW);
digitalWrite(motor2A, LOW);
digitalWrite(motor2B, HIGH);
}
void motoresAtras(){
digitalWrite(motor1A, LOW);
digitalWrite(motor1B, HIGH);
digitalWrite(motor2A, HIGH);
digitalWrite(motor2B, LOW);
}
Serial.println();
Serial.println("*********");
*/
void conectaWiFi(){
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid,password);
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
Serial.println("MAC address: ");
Serial.println(WiFi.macAddress());
//http://sensor1.local
if (!MDNS.begin("sensor1")) {
}
else{
servidor.begin();
MDNS.addService("http", "tcp", 80);
}
}
void conexionURL(){
//Serial.println(mensajeHTML);
int cuantosMensaje = strlen(mensajeHTML);
if(servidorOk){
WiFiClient client;
if (client.connect("192.168.43.112", 80)) {
Serial.print("Bytes ara transmitir: ");
Serial.println(cuantosMensaje);
for(j = 0; j<=cuantosMensaje-1; j++){
client.print(mensajeHTML[j]);
Serial.print(mensajeHTML[j]);
}
Serial.println(" ");
delay(1000);
client.stop();
}
else{
Serial.println("Error de conexion con el servidor");
}
}
else{
Serial.print("Bytes ara transmitir: ");
Serial.println(cuantosMensaje);
for(j = 0; j<=cuantosMensaje-1; j++){
Serial.print(mensajeHTML[j]);
}
Serial.println(" ");
}
}
void setup() {
Serial.begin(115200);
configurarMotores();
// Create the BLE Device
BLEDevice::init("UART Service");
// Create the BLE Server
pServer = BLEDevice::createServer();
pServer->setCallbacks(new MyServerCallbacks());
pTxCharacteristic->addDescriptor(new BLE2902());
pRxCharacteristic->setCallbacks(new MyCallbacks());
// Start advertising
pServer->getAdvertising()->start();
conectaWiFi();
tiempoInicio = millis();
}
void loop() {
if(motorActivado){
tiempoMotorFin = millis();
if(adelante){
if((tiempoMotorFin-tiempoMotorInicio)>adelanteTiempo){
motorActivado = false;
adelante = false;
pararMotor();
}
}
else if(atras){
if((tiempoMotorFin-tiempoMotorInicio)>atrasTiempo){
motorActivado = false;
atras = false;
pararMotor();
}
}
else if(izquierda){
if((tiempoMotorFin-tiempoMotorInicio)>izquierdaTiempo){
motorActivado = false;
izquierda = false;
pararMotor();
}
else if(derecha){
if((tiempoMotorFin-tiempoMotorInicio)>derechaTiempo){
motorActivado = false;
derecha = false;
pararMotor();
//Para el bluetooth
// disconnecting
if (!deviceConnected && oldDeviceConnected) {
delay(500); // give the bluetooth stack the chance to get things ready
pServer->startAdvertising(); // restart advertising
Serial.println("start advertising");
oldDeviceConnected = deviceConnected;
}
// connecting
if (deviceConnected && !oldDeviceConnected) {
// do stuff here on connecting
oldDeviceConnected = deviceConnected;
}
if(modoServidor){
currentLine = " ";
WiFiClient clienteServidor = servidor.available();
finMensaje = false;
if (clienteServidor) {
tiempoConexionInicio = xTaskGetTickCount();
while(clienteServidor.connected()){
if(clienteServidor.available() > 0){
char c = clienteServidor.read(); // read a byte, then
//Quiero recibir un mensaje en formato JSON
//{"NombreVariable":"ValorVariable", "NombreVariable2":"ValorVariable2"}
//Ejemplo enviare desde el cliente QT:
//{"pin":"27", "estado":"0"}
//{"pin":"14", "estado":"0"}
//{"pin":"27", "estado":"1"}
//{"pin":"14", "estado":"1"}
// if the current line is blank, you got two newline characters in a row.
// that's the end of the client HTTP request, so send a response:
if (currentLine.length() == 0) {
//Inicia la respuesta
/*
//Termina la respuesta
*/
if(finMensaje){
String mensajeJSON = currentLine;
//Serial.println(mensajeJSON);
//Decodificacion mensaje JSON - inicio
//StaticJsonBuffer<100> bufferJSON;
//JsonObject& objetoJSON = bufferJSON.parseObject(mensajeJSON);
JsonDocument doc;
deserializeJson(doc, mensajeJSON);
/*
int numeroPin = doc["pin"];
int estadoPin = doc["estado"];
pinMode(numeroPin, OUTPUT);
digitalWrite(numeroPin, estadoPin);
*/
int comando = doc["comando"];
if(comando == 1){
motorActivado = true;
adelante = true;
tiempoMotorInicio = millis();
motoresAdelante();
}
else if(comando == 2){
motorActivado = true;
atras = true;
tiempoMotorInicio = millis();
motoresAtras();
}
else if(comando == 3){
motorActivado = true;
derecha = true;
tiempoMotorInicio = millis();
motoresDerecha();
}
else if(comando == 4){
motorActivado = true;
izquierda = true;
tiempoMotorInicio = millis();
motoresIzquierda();
}
//resuestaServidor();
break;
//resuestaServidor();
//Termina recibir mensaje JSON
tiempoComparacion = xTaskGetTickCount();
if(tiempoComparacion > (tiempoConexionInicio + 3000)){
//clienteServidor.stop();
Serial.println("Error timeout");
break;
}
clienteServidor.stop();
//delay(500);
}
}
else{
tiempoFinal = millis();
if(tiempoFinal > (tiempoInicio+10000)){
tiempoInicio = millis();
//Este if, funcionara cada 2 segundos.
conexionURL();
}
}
}
Código en QT:
MainWindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
ui->setupUi(this);
/*
*/
if (interface.humanReadableName() == nombreRedPrincipal) {
interfaceFound = true;
}
if (!interfaceFound) {
MainWindow::~MainWindow()
delete ui;
if (!lista.empty()) {
QNetworkAddressEntry IP = lista.first();
QNetworkRequest solicitud;
QUrl servidor(url.toUtf8().constData());
if (servidor.isValid()) {
solicitud.setUrl(servidor);
solicitud.setRawHeader(QByteArray("User-Agent"), QByteArray("bot"));
solicitud.setRawHeader(QByteArray("Connection"), QByteArray("close"));
solicitud.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
solicitud.setHeader(QNetworkRequest::ContentLengthHeader, longitudMensaje);
QEventLoop funcionLoop;
funcionLoop.exec();
if (conexionServidor->error() == QNetworkReply::NoError) {
respuesta = QString(datosWeb);
} else {
conexionServidor->deleteLater();
} else {
} else {
}
return respuesta;
void MainWindow::on_pushButton_clicked()
void MainWindow::on_pushButton_2_clicked()
void MainWindow::on_pushButton_3_clicked()
void MainWindow::on_pushButton_4_clicked()
Mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QtNetwork>
#include <QDebug>
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
QT_END_NAMESPACE
Q_OBJECT
public:
~MainWindow();
public slots:
private slots:
void on_pushButton_clicked();
void on_pushButton_2_clicked();
void on_pushButton_3_clicked();
void on_pushButton_4_clicked();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
Main.cpp
#include "mainwindow.h"
#include <QApplication>
MainWindow w;
w.show();
return a.exec();
Mainwindow.ui