From 268c4c5d8717c9e95306548b539f144e6d2030be Mon Sep 17 00:00:00 2001 From: OSchwarzbach <2122623@stud.hs-mannheim.de> Date: Fri, 14 Apr 2023 13:31:54 +0200 Subject: [PATCH] Arduino code with Neumann + .py to write from COM --- ArduinoCodeOscWithNeumann | 60 +++++++++++++++++++++++++++++++++++++++ WriteFromCOMToTxt.py | 13 +++++++++ 2 files changed, 73 insertions(+) create mode 100644 ArduinoCodeOscWithNeumann create mode 100644 WriteFromCOMToTxt.py diff --git a/ArduinoCodeOscWithNeumann b/ArduinoCodeOscWithNeumann new file mode 100644 index 0000000..7e28aec --- /dev/null +++ b/ArduinoCodeOscWithNeumann @@ -0,0 +1,60 @@ +const int adcPin = A0; // ADC-Pin +const int serialBaudRate = 9600; // Baudrate des seriellen Monitors +const int toggleDelay = 0.5; // Verzögerung zwischen dem Umschalten der Bits, 1 ms evtl ausreichend -> testen! + +void setup() { + Serial.begin(serialBaudRate); // Starten des seriellen Monitors + analogReadResolution(12); + +} + +void loop() { + uint32_t buffer[8] = {0}; // Initialisierung des Puffer-Arrays mit Nullen + uint8_t bitCount = 0; // Anzahl der erzeugten Bits + + for (int i = 0; i < 8; i++) { + uint32_t randomValue = 0; // Initialisierung der zufälligen Zahl + + while (bitCount < 32) { + uint16_t adcValue = analogRead(adcPin); // Lesen des ADC-Werts + uint32_t newBit = adcValue & 0x01; // Extrahieren des LSB aus dem ADC-Wert + randomValue = (randomValue << 1) | newBit; // Hinzufügen des neuen Bits an das LSB + bitCount++; // Inkrementierung der Anzahl der erzeugten Bits + delay(toggleDelay); // Verzögerung + } + + buffer[i] = randomValue; // Speichern des zufälligen Werts im Puffer-Array + bitCount = 0; // Zurücksetzen der Anzahl der erzeugten Bits + } + +// Serial.print("Zahl: "); + for (int i = 0; i < 8; i++) { + Serial.print(vonNeumannAlgorithm(formatBinary(buffer[i]))); // Ausgabe der erzeugten 32-Bit-Werte im binären Format + } +// Serial.println(); // Neue Zeile zur Trennung von anderen Ausgaben +} + +String formatBinary(uint32_t number) { + String binaryString = String(number, BIN); // aendern zwischen HEX und BIN moeglich, naechste Zeile mit aendern + while (binaryString.length() < 32) { // bei HEX 8, fuer BIN 32 + binaryString = "0" + binaryString; + } + return binaryString; +} + +String vonNeumannAlgorithm(String binaryString) { + String generatedString = ""; // erzeugter String + int lastIndex = binaryString.length() - 1; // Index des letzten Bits im String + + // Durchlaufen der Bits paarweise + for (int i = 0; i < lastIndex; i += 2) { + if (binaryString.charAt(i) == '0' && binaryString.charAt(i+1) == '1') { + generatedString += '0'; + } else if (binaryString.charAt(i) == '1' && binaryString.charAt(i+1) == '0') { + generatedString += '1'; + } + // wenn beide Bits gleich sind, werden sie verworfen + } + + return generatedString; // Rückgabe des erzeugten Strings +} \ No newline at end of file diff --git a/WriteFromCOMToTxt.py b/WriteFromCOMToTxt.py new file mode 100644 index 0000000..64857cb --- /dev/null +++ b/WriteFromCOMToTxt.py @@ -0,0 +1,13 @@ +import os +import serial + +ser = serial.Serial('COM3', 9600) # Hier musst du den richtigen Port und die richtige Baudrate einstellen +filename = 'binaryDataTestPython.bin' + +with open(filename, 'wb') as file: + while os.path.getsize(filename) < 6000000: # prüfen, ob die Größe der Datei kleiner als 1 Kilobyte ist + if ser.in_waiting > 0: + data = ser.read(ser.in_waiting) # Lesen Sie alle verfügbaren Bytes aus der seriellen Verbindung + print(data) + file.write(data) + file.flush() # Flushe die Datei, um die Daten zu schreiben \ No newline at end of file