Wenn ich mit Freunden Comics übe, zeige ich die Zeilen auf dem Computer vor mir an und verwende sie als Wettbewerb. Wenn Sie die Zeichen in großer Größe anzeigen, können Sie nicht alle Zeilen sehen, ohne zu scrollen. Aus diesem Grund habe ich ein Gerät entwickelt, mit dem der Bildschirm eines PCs per Fernzugriff nach oben und unten gescrollt werden kann.
Ich dachte an ein System, bei dem der PC einen Bildlauf durchführt, wenn Sie den an der Steuerung angebrachten Schalter drücken.
Die Konfiguration des gesamten Systems ist wie folgt.
Die Details der obigen Systemübersicht sind unten gezeigt. (Da es nicht nur praktisch ist, sondern auch als Teil des Studiums gedacht ist, habe ich es mit der Absicht ausgewählt, verschiedene Geräte zu verwenden.)
Danach werde ich in diesem Artikel nicht mehr darauf eingehen, aber ich habe Folgendes als Kommunikations-Debugging-Tool wie serielles Senden und Empfangen verwendet.
Zusätzlich hat das drahtlose Modul über Bluetooth die Sendeseite (SBDBT) als Slave und die Empfangsseite (rn42xvp-i / rm) als Master. Der Grund dafür ist, dass SBDBT standardmäßig ein Slave ist und ein Schreibschreiber für den Mikrocomputer (PIC24FJ64GB004-I / PT) erforderlich ist, um zu einem Master zu wechseln. Da die Einstellung von rn42xvp-i / rm einfach durch Senden eines Befehls von einem Terminal wie dem seriellen Monitor von Arduino oder TeraTerm geändert werden kann, wurde die Einstellung von rn42xvp-i / rm auf der Sendeseite geändert und als Master verwendet. (Details zur Einstellung werden später beschrieben)
Ich dachte ... aber rn42xvp-i / rm schien standardmäßig der Master zu sein. Selbst wenn Sie ohne darüber nachdenken, können Sie die Einstellungen leicht ändern und es ist praktisch, so dass ich rn42xvp-i / rm als Master verwendet habe.
Wie oben erwähnt, können die Einstellungen des Funkmoduls auf der Sendeseite nicht ohne einen Bildschreiber geändert werden, sodass rn42xvp-i / rm auf der Empfangsseite als Master verwendet wurde. Durch Ändern der Einstellung von rn42xvp-i / rm im Voraus durch Senden eines Befehls vom Terminal ist es möglich, Bluetooth-Module miteinander zu verbinden.
Das Verfahren ist unten gezeigt. Sie können dies vom seriellen Monitor der Arduino IDE oder von TeraTerm aus tun. Führen Sie die Ausführung auf dem seriellen Monitor von Arduino aus, nachdem Sie Folgendes geschrieben haben.
change_bt_settings.c
#include <SoftwareSerial.h>
#define BT_RX 8
#define BT_TX 7
#define BPS 115200 // rn42xvp-i/Standard-Baudrate von rm
SoftwareSerial btSerial(BT_RX, BT_TX); //Serieneinstellungen für die Interaktion mit Bluetooth
void setup()
{
Serial.begin(BPS); // PC -Initialisierung der seriellen Kommunikation zwischen Arduino
btSerial.begin(BPS); // Arduino -Initialisierung der seriellen Kommunikation zwischen Bluetooth
}
void loop()
{
//Übertragungsprozess von Arduino zu Bluetooth
if (Serial.available())
{
btSerial.print(char(Serial.read()));
// btSerial.write(Serial.read()); //Auch hier OK]
}
//Empfangsverarbeitung des Signals von Bluetooth
if (btSerial.available())
{
Serial.print(char(btSerial.read()));
// Serial.write(btSerial.read()); //Auch hier OK
}
delay(50);
}
Außerdem habe ich zur Implementierung auf den folgenden Artikel verwiesen. ・ Http://workpiles.com/2014/04/rn42-bluetooth1/ ・ Htp: // Kosakai. Rld. Kokan. jp / R-42. html
Das Einstellverfahren ist wie folgt.
Nummer | Befehl | Neue Zeile | Antwort | Bedeutung |
---|---|---|---|---|
1 | $$$ | Keiner | CMD | Befehlsmodus starten |
2 | SA,0 | Ja | AOK | Geändert, keine Notwendigkeit zur Authentifizierung für die Verbindung |
3 | SU,96 | Ja | AOK | Ändern Sie die Baudrate auf 9600 |
4 | R,1 | Ja | Reboot! | Starten Sie das Modul neu (dies spiegelt die Einstellungsänderungen wider). |
Ich überlegte, was ich als Basis verwenden sollte, aber gewöhnliche Plastikplatten und Universalplatten Da es schwierig zu verarbeiten ist, haben wir eine 5 mm dicke geschäumte Styrolplatte verwendet, die relativ steif und leicht zu verarbeiten ist. Die geschäumte Styrolplatte wurde auf eine geeignete Größe verarbeitet, und ein Batteriekasten und eine Platte wurden angebracht.
Die Empfangsseite ist möglicherweise direkt mit einem PC verbunden, daher habe ich sie mit einem Steckbrett erstellt.
send_data_to_arduino.c
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#define OFF 0 //Zum Umschalten
#define ON 1 //Das gleiche wie oben
#define READ 0 //Zur Einstellung des Portregisters
#define WRITE 1 //Das gleiche wie oben
#define CNTD 0 //Dient zum Messen der Zeit, in der der Schalter gedrückt gehalten wird
#define CNTU 1 //Das gleiche wie oben
#define KRTIME 100000 //Zeit, den Schalter gedrückt zu halten, um als gedrückt erkannt zu werden
void AVR_init(void)
{
//Einstellungen wie serielle Kommunikation
DDRD=(READ<<PD0)|(WRITE<<PD1)|(READ<<PD4)|(READ<<PD5)|(WRITE<<PD6);
}
void USART_init(void)
{
unsigned int baud;
baud=8000000/16/9600-1; //Baudratenberechnung(Die Berechnungsformel ist die Spezifikation P..75 Unten aufgeführt)
UBRRH=(unsigned char)(baud>>8); //Einstellung der Baudrate(Oberes Byte)
UBRRL=(unsigned char)baud; //Einstellung der Baudrate(Unteres Byte)
UCSRC=(0<<USBS)|(3<<UCSZ0); //Stellen Sie die verwendete Bitlänge auf 8 Bit und das Stoppbit auf 2 Bit ein
UCSRB=(1<<RXEN)|(1<<TXEN); //Erlaubnis senden / empfangen
}
void Utx(char *data) //Datenübertragung
{
int i;
//Kündigungscharakter "\Schleife auf "0"
for(i=0; data[i]!='\0'; i++)
{
while(!(UCSRA & (1<<UDRE)) );
UDR=data[i];
}
}
void INT_init(void)
{
//INT0 und 1(Stifte 6 und 7)Interrupts zulassen
GIMSK=0b11000000; //Allgemeines Interrupt-Aktivierungsregister
MCUCR=0b00001111; //Stellen Sie den externen Interrupt-Trigger für INT0 und 1 an der oberen Flanke ein
// SREG=0b10000000; //Mehrfachinterrupt deaktiviert → Standardmäßig deaktiviert
}
ISR(INT0_vect) //Pin 7 Interrupt-Handler
{
//Geschwätzige Maßnahmen
_delay_ms(50);
EIFR=ON<<INTF0;
Utx("UP");
Utx("_"); //Kündigungscharakter
}
ISR(INT1_vect) //Pin 6 Interrupt-Handler
{
//Geschwätzige Maßnahmen
_delay_ms(50);
EIFR = ON<<INTF1;
Utx("DOWN");
Utx("_"); //Kündigungscharakter
}
unsigned char Urx(void) //Datenempfang
{
while(!(UCSRA & (1<<RXC)) );
return UDR;
}
int main(void)
{
//Tastenwiederholung(Halten Sie den Schalter gedrückt)Zeitmessung
static unsigned long rptcnt[1] = {}; //Da int zu 2 Bytes wurde, deklarieren Sie es so lange
AVR_init();
USART_init();
INT_init();
sei(); //Alle Anweisungen zur Unterbrechungsberechtigung
PORTD=ON<<PD6; //Immer 5V Ausgang(Zum Umschalten)
for(;;)
{
//Korrespondenzverarbeitung, um die Taste gedrückt zu halten
if (bit_is_set(PIND, 4)) //Wenn PD4 1 ist (Drücken der Taste)
{
if (rptcnt[CNTD] > KRTIME) //Erkennt das Halten
{
Utx("UP");
Utx("_"); //Kündigungscharakter
_delay_ms(100);
}
else //Schlüsselwiederholungszeit hinzufügen
{
rptcnt[CNTD]++;
}
}
else if (bit_is_set(PIND, 5)) //Wenn PD5 1 ist (Drücken der Taste)
{
if (rptcnt[CNTU] > KRTIME) //Erkennt das Halten
{
Utx("DOWN");
Utx("_"); //Kündigungscharakter
_delay_ms(100);
}
else //Haltezeit hinzufügen
{
rptcnt[CNTU]++;
}
}
else //Löschen Sie die Haltezeit auf Null
{
rptcnt[CNTD] = 0;
rptcnt[CNTU] = 0;
// memset(rptcnt, 0, sizeof(rptcnt)*10); //Nicht verwenden, da dies vom Verarbeitungssystem abhängt
}
}
}
relay_data_to_PC.c
#include <SoftwareSerial.h>
#define BT_RX 8 // Arudino-Wird für die serielle Kommunikation zwischen Bluetooth verwendet
#define BT_TX 7 //Das gleiche wie oben
#define BAUD 9600 //Baudrate für die serielle Kommunikation
#define OUT_5V 2 //PIN Nummer
#define IN_5V 3 //Das gleiche wie oben
#define LED_OUT 4 //Das gleiche wie oben
#define BUFF_MAX 5 //Kapazität des seriellen Empfangspuffers (Einheit: Zeichen)
// Arudino-Serielle Softwareeinstellungen zwischen Bluetooth
SoftwareSerial btSerial(BT_RX, BT_TX);
void setup()
{
Serial.begin(BAUD);
btSerial.begin(BAUD);
pinMode(OUT_5V, OUTPUT); //Wird zum Umschalten verwendet
pinMode(IN_5V, INPUT); //Das gleiche wie oben
}
void init_bt() //Verbindung mit Bluetooth-Modul
{
btSerial.print("$$$"); //Übergang in den Einstellmodus
delay(1000);
btSerial.print("C,00198600035E\n"); //Stellen Sie eine Verbindung zu anderen Bluetooth-Modulen her
delay(5000);
btSerial.print("---\n"); //Beenden Sie den Befehlsmodus, wenn die Verbindung fehlschlägt (bei Erfolg ignoriert).
}
void loop()
{
char buff[BUFF_MAX]={'\0'};
static int cnt = 0;
digitalWrite(OUT_5V, HIGH); //Immer 5V Ausgang (zum Schalten)
//Bluetooth-Verbindung nach Drücken des Schalters
if (digitalRead(IN_5V))
{
init_bt();
}
//Übertragungsprozess zum Bluetooth-Modul (wird beim Senden vom seriellen Monitor verwendet)
if (Serial.available())
{
btSerial.print(char(Serial.read()));
delay(100);
}
//Verarbeitung vom Bluetooth-Modul empfangen
if (btSerial.available())
{
//Senden Sie den empfangenen Wert an die PC-Seite
Serial.print(btSerial.readStringUntil('_')); //Verwenden Sie Bis, weil readString langsam ist (Argument ist Endzeichen).
delay(100);
}
}
scroll_screen_bt.py
import serial
import re
import pyautogui as pgui
def ctrl_screen(): # 0.Führen Sie die Verarbeitung in Intervallen von 08 Sekunden durch
with serial.Serial('COM8', 9600, timeout=0.08, stopbits=serial.STOPBITS_TWO) as ser:
while True:
val = ser.readline()
val = val.decode() #Konvertieren Sie den Bytetyp in den Str-Typ (Unicode-Zeichenfolge).
if val == 'UP':
pgui.typewrite(['up']) #Scrollen Sie auf dem Bildschirm nach oben
elif val == 'DOWN':
pgui.typewrite(['down']) #Scrollen Sie auf dem Bildschirm nach unten
if __name__ == "__main__":
ctrl_screen()
Das Schaltbild dieses Systems ist unten dargestellt. Ich habe draw.io zum Zeichnen verwendet. Ich habe zum ersten Mal einen Schaltplan geschrieben, aber er ist kostenlos, einfach zu schreiben und praktisch!
Schalten Sie sowohl den Master als auch den Slave ein. (Master verbindet sich nur mit PC)
Drücken Sie den Schalter auf der Slave-Seite, um den PC-Bildschirm nach oben und unten zu scrollen.
Wenn Sie die Einstellung von ATtiny2313 ändern, um einen externen Quarzoszillator zu verwenden, funktioniert der Mikrocomputer natürlich nicht oder schreibt nicht einmal, wenn Sie keinen externen Quarzoszillator anschließen. Ein interner Oszillator ist genug! Wenn Sie einen externen Oszillator ohne externen Oszillator verwenden, können Sie nichts tun, es sei denn, Sie schließen einen externen Oszillator an (ich bin es).
Wenn Sie die serielle Softwarebibliothek mit Arduino verwenden, gelten Einschränkungen für die Pins, die verwendet werden können. Details unten ↓ https://garretlab.web.fc2.com/arduino_reference/libraries/standard_libraries/SoftwareSerial/
Zusätzlich zu den bisher in diesem Artikel erwähnten Websites wurden die folgenden Websites verschuldet. Vielen Dank.
Inhalt | Linkziel |
---|---|
Grundlegende Verwendung von ATtiny2313 | http://lumenbolk.com/?p=19 |
Fehlerbehebung durch "Seriennummer importieren" | https://teratail.com/questions/101843 |
PC(Python)Serielle Kommunikation zwischen und ardino | https://qiita.com/Acqua_Alta/items/9f19afddc6db1e4d4286 |
Kbhit in Arduino()Benutzerfreundlichkeit von | https://forum.arduino.cc/index.php?topic=294636.0 |
So erkennen Sie wichtige Ereignisse in Arduino | https://www.quora.com/How-do-I-detect-a-keyboard-event-in-an-Arduino-IDE-program |
Schlüsseloperationsmethode von Python | https://www.lisz-works.com/entry/pyautogui-key |
Schlüsseloperationsmethode von Arduino | https://garretlab.web.fc2.com/arduino_reference/language/functions/usb/keyboard/write.html |
So empfangen Sie Zeichenketten in der seriellen Arduino-Kommunikation | https://ch.nicovideo.jp/yugata/blomaga/ar1177727 |
Es ist besser, das hier zu tun ... oder hier stimmt etwas nicht! Wenn Sie Fragen haben, tut es mir leid, Sie zu beunruhigen, aber wenn Sie darauf hinweisen können, werde ich gerne Tränen vergießen.
Recommended Posts