Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

SomfyDuino: Adaptador USB a Somfy IO para Arduino Nano

Componentes y suministros

ComponenteCantidad
Arduino Nano R31
Cable plano 7 hilos1
Mando a distancia Somfy IO (ej. modelo GX037)1

Herramientas necesarias

Sobre el proyecto

Ideación

Quería integrar mis persianas enrollables Somfy IO en mi sistema domótico casero sin depender de hardware en la nube del proveedor original. ¡Y funcionó! Usando solo un mando IO simple y un Arduino Nano.

Necesitas:

El mando se alimenta del Arduino (~20 mA al transmitir). Retira la pila del mando. Conexiones según esquemas adjuntos.

Sobre el código

Si conectas el conjunto a una Raspberry Pi, elimina todos los Serial.print para que el Arduino solo escuche y responda, facilitando la comunicación.

El protocolo de comandos por serie se explica en el código.

¡Diversión! Comentarios bienvenidos. —Bjoern

Nota: Usé mando de 1 canal. El botón SELECT no cambia de canal en este modelo, pero no rompe nada.

Código: Serie a Somfy

// SomfyDuino v0.71 - Bjoern Foldenauer
int progPin = 8;
int upPin = 12;
int downPin = 10;
int myPin = 11;
int selectPin = 9;
int ledPin = 13;

bool upPress = false, downPress = false, myPress = false;
bool progPress = false, selectPress = false;
unsigned long holdTime = 0;
int repeatSend = 0;
char incomingChar;

void setup() {
  Serial.begin(9600);
  Serial.println("SomfyDuino 0.71");
  Serial.println("Bjoern Foldenauer");
  Serial.println("-----");
  Serial.println("Recibe caracteres serie:");
  Serial.println("u - preparar pulsación SUBIR");
  Serial.println("d - preparar pulsación BAJAR");
  Serial.println("m - preparar pulsación MY");
  Serial.println("p - preparar pulsación PROG");
  Serial.println("s - preparar pulsación SELECT");
  Serial.println("r - incrementar contador de repeticiones");
  Serial.println("digito X - incrementar tiempo retención X*100 ms");
  Serial.println("e - EJECUTAR: pulsa y mantiene botones definidos");
  Serial.println("");
  Serial.println("Ejemplos:");
  Serial.println("  SUBIR normal: u5e");
  Serial.println("  SUBIR+BAJAR 3s: ud9993e");
  Serial.println("  PROG 5s: p999995e");
  Serial.println("");

  pinMode(progPin, OUTPUT);
  pinMode(upPin, OUTPUT);
  pinMode(downPin, OUTPUT);
  pinMode(myPin, OUTPUT);
  pinMode(ledPin, OUTPUT);
  pinMode(selectPin, OUTPUT);
  
  // Botones activos en LOW (pull-up internos del mando)
  digitalWrite(progPin, HIGH);
  digitalWrite(upPin, HIGH);
  digitalWrite(downPin, HIGH);
  digitalWrite(myPin, HIGH);
  digitalWrite(selectPin, HIGH);
  digitalWrite(ledPin, LOW);
}

void loop() {
  while (Serial.available() == 0) delay(50);
  
  if (Serial.available() > 0) {
    incomingChar = Serial.read();
    Serial.println(incomingChar);
    
    if (incomingChar == 'u') upPress = true;
    if (incomingChar == 'd') downPress = true;
    if (incomingChar == 'm') myPress = true;
    if (incomingChar == 'p') progPress = true;
    if (incomingChar == 's') selectPress = true;
    
    if (incomingChar >= '1' && incomingChar <= '9') 
      holdTime += (incomingChar - '0') * 100;
    
    if (incomingChar == 'r') repeatSend++;
    if (incomingChar == 'e') somSend();
  }
}

void somSend() {
  Serial.print("Pulsando: ");
  for (int i = 0; i <= repeatSend; i++) {
    if (upPress) { digitalWrite(upPin, LOW); Serial.print("up "); }
    if (downPress) { digitalWrite(downPin, LOW); Serial.print("down "); }
    if (myPress) { digitalWrite(myPin, LOW); Serial.print("my "); }
    if (progPress) { digitalWrite(progPin, LOW); Serial.print("prog "); }
    if (selectPress) { digitalWrite(selectPin, LOW); Serial.print("select "); }
    
    digitalWrite(ledPin, HIGH);
    Serial.print("por "); Serial.print(holdTime); Serial.println(" ms");
    delay(holdTime);
    
    // Soltar todos
    digitalWrite(progPin, HIGH);
    digitalWrite(upPin, HIGH);
    digitalWrite(downPin, HIGH);
    digitalWrite(myPin, HIGH);
    digitalWrite(selectPin, HIGH);
    digitalWrite(ledPin, LOW);
    delay(holdTime); // Pausa entre repeticiones
  }
  
  // Reset para próximo comando
  upPress = downPress = myPress = progPress = selectPress = false;
  holdTime = 0;
  repeatSend = 0;
  Serial.println("hecho.");
}

Esquemáticos

Tres imágenes: esquema de conexiones, foto del montaje en cable plano, y detalle del mando desmontado. No hay documento PDF.

Proceso de manufactura

  1. Monitorización meteorológica remota con Raspberry Pi 3 y PubNub
  2. Construya un Mando Universal Profesional para Raspberry Pi con LIRC
  3. Capturar comandos de mando IR en Raspberry Pi sin LIRC: enfoque Python UART
  4. Sistema de Monitorización Remota de Frecuencia Cardíaca con Alertas AWS IoT
  5. Interruptor Inteligente de Corriente Alterna Controlado por SMS con Raspberry Pi y Hologram
  6. ROObockey: Robot de Hockey Callejero con Asistencia de Precisión y Control Remoto
  7. Monitorización en la nube: Sistema de control remoto para gestión de activos en tiempo real
  8. 5 Beneficios clave del control remoto de producción para la industria moderna
  9. Acceso Remoto Seguro gRPC con grpcurl en Dispositivos PLCnext
  10. 3 principales beneficios de la monitorización remota para la eficiencia de fabricación
  11. Mejora de sistemas de monitorización remota con actualizaciones avanzadas de IoT