[Python / C] Ich habe versucht, ein Gerät zu erstellen, das den Bildschirm eines PCs drahtlos aus der Ferne scrollt.

Zusammenfassung

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.

Systemkonfiguration

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.

キャプチャ.PNG

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.)

  1. Absender
  1. Empfangsseite
  1. PC-Seite

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.

Empfangen des Funkmoduls: rn42xvp-i / rm-Einstellungen

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).

Was ich gemacht habe (Hardware)

    1. Absender (ATtiny2313)

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.

image.png

image.png

  1. Empfangsseite (Arduino Micro)

Die Empfangsseite ist möglicherweise direkt mit einem PC verbunden, daher habe ich sie mit einem Steckbrett erstellt.

image.png

Quelldatei

    1. Absender (ATtiny2313)

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
		}
	}
}
  1. Empfangsseite (Arduino Micro)

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);
  }
}
    1. PC-Seite (nur das ist Python)

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()

Schaltkreis

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!

    1. Absender (ATtiny2313)

image.png

  1. Empfangsseite (Arduino Micro)

image.png

Wie benutzt man

    1. Starten Sie auf der PC-Seite das Python-Skript.
  1. Schalten Sie sowohl den Master als auch den Slave ein. (Master verbindet sich nur mit PC)

    1. Drücken Sie den Schalter auf der Masterseite, um die Bluetooth-Module zu verbinden. Wenn die Verbindung erfolgreich hergestellt wurde, leuchtet die blinkende LED. Nun bereit image.png
  2. Drücken Sie den Schalter auf der Slave-Seite, um den PC-Bildschirm nach oben und unten zu scrollen. image.png

Vorsichtsmaßnahmen für die Umsetzung

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/

Informationen, die als Referenz verwendet wurden

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

Schließlich

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

[Python / C] Ich habe versucht, ein Gerät zu erstellen, das den Bildschirm eines PCs drahtlos aus der Ferne scrollt.
Ich habe einen schlaffen Bot gemacht, der mich über die Temperatur informiert
Ich habe einen Kalender erstellt, der den Verteilungsplan von Vtuber automatisch aktualisiert
Ich habe ein Programm erstellt, um die Größe einer Datei mit Python zu überprüfen
Ich habe eine Funktion erstellt, um die Bewegung eines zweidimensionalen Arrays (Python) zu sehen.
Ich habe ein Skript erstellt, das das aktive Fenster mit win32gui von Python aufzeichnet
[Python] Ich habe einen Web-Scraping-Code erstellt, der automatisch den Nachrichtentitel und die URL von Nihon Keizai Shimbun erfasst.
[Python] Ein Programm, das die Anzahl der Täler zählt
Ich habe eine VM erstellt, auf der OpenCV für Python ausgeführt wird
Python zeigt aus der Perspektive eines C-Sprachprogrammierers
Ein Memo, dass ich den Datenspeicher mit Python berührt habe
[Python] Ein Programm, das die Positionen von Kängurus vergleicht.
Ich habe eine Twitter-App erstellt, die die Zeichen der Vorverbindung mit Heroku entschlüsselt (Fehler).
Ich habe einen Kalender erstellt, der den Verteilungsplan von Vtuber automatisch aktualisiert (Google Kalender Edition).
Ich habe einen Python-Text gemacht
Ich habe eine Funktion erstellt, um das Modell von DCGAN zu überprüfen
Ich habe ein Punktbild des Bildes von Irasutoya gemacht. (Teil 1)
Ich habe ein Punktbild des Bildes von Irasutoya gemacht. (Teil 2)
Python-Skript, das den Inhalt zweier Verzeichnisse vergleicht
[Atcoder] [C ++] Ich habe ein Testautomatisierungstool erstellt, das während des Wettbewerbs verwendet werden kann
Ich habe eine Funktion zum Trimmen des Bildes von Python openCV erstellt. Verwenden Sie sie daher bitte.
Ich habe in Python ein Programm erstellt, das die 1-Minuten-Daten von FX auf eine beliebige Zeit (1 Stunde usw.) ändert.
Ich habe eine C ++ - Lernseite erstellt
[Python] Ich habe einen Line-Bot erstellt, der zufällig nach englischen Wörtern fragt
Ich habe ein Paket erstellt, das morphologische Analysegeräte mit Python vergleichen kann
Ich habe einen Line-Bot mit Python gemacht!
Ich habe einen Linienbot erstellt, der das Geschlecht und das Alter einer Person anhand des Bildes errät
[Einführung in Python] Ich habe die Namenskonventionen von C # und Python verglichen.
Ich habe mit Python eine Lotterie gemacht.
Eine Funktion, die die Verarbeitungszeit einer Methode in Python misst
Ich habe ein Shuffle gemacht, das mit Python zurückgesetzt (zurückgesetzt) werden kann
Ich habe versucht, ein Gerüstwerkzeug für Python Web Framework Bottle zu erstellen
Ich habe mit Python einen Daemon erstellt
Ich habe ein Programm erstellt, das den Tierkreis mit tkinter automatisch berechnet
[Python] Ein Hinweis, dass ich das Verhalten von matplotlib.pyplot zu verstehen begann
Die Geschichte, ein Modul zu erstellen, das E-Mails mit Python überspringt
[Python] Ich habe eine Klasse erstellt, die schnell einen Dateibaum schreiben kann
[Python] Ein Programm, das den Inhalt der Liste nach links dreht
[Kaggle] Ich habe mit dem Titanic-Tutorial eine Sammlung von Problemen erstellt
[Python] Ich habe das Tagebuch eines Mannes im ersten Jahr des Arbeitslebens analysiert und das Arbeitsleben positiv / negativ beurteilt.
[Python] Ich habe einen Bot erstellt, der mir die aktuelle Temperatur anzeigt, wenn ich einen Ortsnamen in LINE eingebe
[Python] Ein Programm, das die Anzahl der Schokoladensegmente berechnet, die die Bedingungen erfüllen
[Erklärung zum AtCoder] Kontrollieren Sie die A-, B- und C-Probleme von ABC182 mit Python!
[Python] Ich habe einen Dekorateur gemacht, der keinen Nutzen zu haben scheint.
Ich habe eine Webanwendung in Python erstellt, die Markdown in HTML konvertiert
[Python] Ein Programm, das die Anzahl der gepaarten Socken berechnet
Ich habe in Python einen Discord-Bot erstellt, der übersetzt, wenn er reagiert
[Python] Ich habe ein Dienstprogramm erstellt, das wie ein Pfad auf den Diktattyp zugreifen kann
Ich habe eine Bibliothek konoha gemacht, die den Tokenizer auf ein schönes Gefühl umstellt
Ich habe ein Tool erstellt, das die Dekomprimierung mit CLI (Python3) etwas erleichtert.
[IOS] Ich habe ein Widget erstellt, das den Trend von Qiita in Pythonista3 anzeigt. [Python]
Ich habe einen Fehler beim Abrufen der Hierarchie mit MultiIndex von Pandas gemacht
Python: Ich möchte die Verarbeitungszeit einer Funktion genau messen
[AtCoder Erklärung] Kontrollieren Sie ABC184 A, B, C Probleme mit Python!
[Python] Hinweis: Selbst erstellte Funktion zum Ermitteln des Bereichs der Normalverteilung