Étape 3: Programmation - côté PC
Le programme va générer la charge utile de commande selon les options de ligne de commande (voir utilisation) et envoyer la commande à l’appareil connecté au port USB.
Le port peut être spécifié avec l’option -u, sinon il va essayer/dev/ttyUSB0, / dev/ttyUSB0, / dev/ttyACM0, /dev/ttyACM1, comme l’arduinos peut être mappée en tant que (au moins) ces fichiers, selon le type de l’arduino et les déconnexions/reconnexions.
Comme indiqué dans l’introduction de que l’Arduino doit avoir sa fonction autoreset désactivée, sinon il se réinitialise chaque fois qu’une connexion soit établie. Il s’agit de la façon dont l’IDE permet de programmer la puce, mais il n’est pas souhaitable dans notre cas. Si vous souhaitez tester le code avec un arduino autoreset activé, vous devez ajouter une commande de sleep(2) après la connexion (après l’ouverture du fichier ATS) à laisser l’arduino réinitialiser et être en mesure d’obtenir les messages.
Comme prévu, le code envoie un « I » caractère à l’Arduino, puis envoie la charge utile et lire le fichier pour attendre la réponse de l’Arduino. Cette étape n’est pas essentielle pour un envoi de commande simple, mais il sera si le but est d’extraire les informations de l’Arduino lui-même ou un autre dispositif commandé par radio. Car maintenant l’Arduino répond juste « OK » si le programme se contente d’afficher la réponse comme c’est.
Quant à la partie de l’Arduino, il y a une partie du code où le message est converti en représentation ASCII du message binaire.
message [0] = « I » ;
en tournant la charge utile binaire en caractères ASCII (représentation hexadécimal)
pour (i = 1, j = 0; j’ai < 39 ; j’ai += 2, j ++) {}
message [i] = (charge utile [j] & 0xF0) >> 4 ;
Si {(message [i] </10)
message [i] = « 0 » ; ASCII
} else {}
message [i] += « A » - 10 ;
}
message [i + 1] = charge utile [j] & 0x0F ;
Si (message [i + 1] < 10) {}
message [i + 1] = « 0 » ; ASCII
} else {}
message [i + 1] += « A » - 10 ;
}
printf ("0 x %c %c", message [i], message[i+1]) ;
}
Opérateurs de bits une fois de plus sont utilisés pour sélectionner et déplacer les premiers ou le derniers 4 bits et le convertir en un chiffre ou un caractère (A à F) :
message [i] = (charge utile [j] & 0xF0) >> 4 ;
Ici, nous prenons le byte et appliquez un masque 11110000 donc nous obtenons seulement les bits de gauche avant tout, et nous déplacer ces bits vers la droite
message [i + 1] = charge utile [j] & 0x0F ;
Ici même, mais les morceaux sélectionnés sont déjà à la droite de l’octet donc aucun changement n’est nécessaire.
Si {(message [i] </10)
message [i] = « 0 » ; ASCII
} else {}
message [i] += « A » - 10 ;
}
Ici, si le chiffre est < 10 la valeur ASCII est comprise entre 48 et 57 (décimal), et nous avons juste devez ajouter la valeur représentée à la valeur de caractère « 1 » (qui est 48 mais « 1 » est utilisable sans connaître la table ASCII par coeur;)). De même pour les caractères A à F, mais A(Hex) est 10(Decimal), donc si nous avons ajouté la valeur représentée à la valeur ASCII de « A » nous serions 10 valeurs à haut. Si l'on additionne la valeur -10 et la fin avec le caractère approprié.
Maintenant, vous vous demandez peut-être pourquoi nous dérange conversion hexadécimal en ASCII et ASCII pour Hex de l’autre côté. Vous ne serait pas juste de;)
En effet, dans ce cas, il est inutile, et la première version du code ont travaillé directement avec les valeurs binaires. En fait, il a travaillé en envoyant uniquement les 5 octets qui sont réellement utiles et l’Arduino fait la mise à jour du modèle de charge utile. Alors maintenant, nous enverrons 40 octets au lieu de 5. Pour quelle raison ?
Eh bien, même si c’est hors de ce particulier instructable j’ai indiqué que j’avais un deuxième micro contrôleur dans ma chambre pour la deuxième unité de climatisation. Cette puce est une abeille de Wifi Seeediuno. J’ai trouvé ça difficile à mettre en œuvre le comportement correct qu’à l’aide de la puce prises donc j’ai fini par utiliser le serveur web intégré de minimaliste, donc j’ai envoyer la pleine commande IR dans l’URL en caractères Hex.
Maintenant, vous avez la raison : je voulais utiliser le même code pour contrôler les deux unités, l’envoi de données sur USB ou via WiFi mais en manipulant le même message, dans le même format.