Arduino Micro Website basierend Programmieren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
cuzimfuchs
User
Beiträge: 2
Registriert: Samstag 5. Oktober 2024, 23:13

Hallo, vorab eine Erklärung was das Ziel ist. Ziel ist es, jemanden das Programmieren eines Arduino Micros mit USB-A zu vereinfachen. Der User soll den Stick einstecken, seine gewünschte Vorlage abtippen und den Text dann auf den Arduino hochladen. Jedes mal wenn "mann" ihn einsteckt, wird der Text automatisch abgetippt. Wie gesagt es soll den User vereinfachen den Stick zu programmieren. Will es Website basierend machen. Habe ein VPS Server mit "app.py" und "index.html". Natürlich ist die Arduino-CLI auch drauf.

app.py:

Code: Alles auswählen

from flask import Flask, render_template, request, redirect, url_for, flash
import os
import subprocess

app = Flask(__name__)
app.secret_key = '1234'  # Ändere dies zu einem sicheren Schlüssel

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/upload', methods=['POST'])
def upload():
    text = request.form['text']
    com_port = request.form['com_port']  # COM-Port vom Formular

    # Debug-Print für den COM-Port
    print(f'Selected COM-Port: {com_port}')

    if not text or not com_port:
        flash('Bitte gib einen Text ein und wähle einen COM-Port aus.')
        return redirect(url_for('index'))

    try:
        sketch_path = generate_sketch(text)
        compile_and_upload(sketch_path, com_port)  # COM-Port sollte korrekt sein

        flash('Text erfolgreich hochgeladen!')
    except Exception as e:
        flash(f'Fehler: {e}')
    return redirect(url_for('index'))

def generate_sketch(text):
    """Generiert den Arduino-Sketch und speichert ihn als .ino-Datei."""
    sketch_code = f'''
    #include <KeyboardDE.h>  // Verwende die KeyboardDE-Bibliothek

    const char myText[] PROGMEM = R"({text})";

    void setup() {{
        Keyboard.begin();
        delay(5000);  // Warte 5 Sekunden, um die Eingabe zu ermöglichen

        for (int i = 0; i < sizeof(myText); i++) {{
            char ch = pgm_read_byte_near(myText + i);
            if (ch == '\\0') break;
            Keyboard.write(ch);
        }}

        Keyboard.end();
    }}

    void loop() {{
        // Kein Code hier benötigt
    }}
    '''

    sketch_path = os.path.join('/home/Flask_app', 'Flask_app.ino')
    with open(sketch_path, 'w', encoding='utf-8') as f:
        f.write(sketch_code)

    return sketch_path

def compile_and_upload(sketch_path, com_port):
    """Kompiliert und lädt den Sketch auf das Arduino hoch."""
    arduino_cli_path = '/home/Flask_app/arduino-cli'  # Pfad zur Arduino CLI (stelle sicher, dass es ausführbar ist)

    # Füge den Pfad zur benutzerdefinierten Bibliothek hinzu
    library_path = '/home/Flask_app/KeyboardDE'  # Pfad zur KeyboardDE-Bibliothek anpassen
    os.environ['ARDUINO_LIBS'] = library_path  # Setze die Umgebungsvariable

    # Kompilieren
    compile_cmd = [arduino_cli_path, 'compile', '--fqbn', 'arduino:avr:micro', '--libraries', library_path, sketch_path]
    compile_process = subprocess.run(compile_cmd, capture_output=True, text=True)
    if compile_process.returncode != 0:
        raise Exception(f"Kompilierung fehlgeschlagen: {compile_process.stderr}")

    # Hochladen
    upload_cmd = [arduino_cli_path, 'upload', '-p', com_port, '--fqbn', 'arduino:avr:micro', sketch_path]
    upload_process = subprocess.run(upload_cmd, capture_output=True, text=True)
    if upload_process.returncode != 0:
        raise Exception(f"Hochladen fehlgeschlagen: {upload_process.stderr}")

if __name__ == '__main__':
    app.run(host='0.0.0.0', debug=True)
index.html:

Code: Alles auswählen

<!DOCTYPE html>
<html lang="de">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Arduino Uploader</title>
    <script>
        let port;

        async function connectSerial() {
            try {
                // Überprüfe, ob die Web Serial API unterstützt wird
                if ('serial' in navigator) {
                    // Fordere den Benutzer auf, einen COM-Port auszuwählen
                    port = await navigator.serial.requestPort();
                    
                    // Versuche, den Port zu öffnen
                    await port.open({ baudRate: 9600 });

                    // Hole die Port-Informationen
                    const portInfo = port.getInfo();

                    // Debugging-Meldung um zu sehen, was wir bekommen
                    console.log('Port-Info:', portInfo);

                    // Setze den COM-Port-String manuell
                    document.getElementById('com_port').value = portInfo.usbProductId; // Setzt die USB-Produkt-ID direkt
                    alert(`Port ausgewählt: ${portInfo.usbProductId}`);
                } else {
                    alert('Web Serial API wird von diesem Browser nicht unterstützt.');
                }
            } catch (e) {
                alert(`Fehler beim Verbinden mit dem seriellen Port: ${e}`);
            }
        }
    </script>
</head>
<body>
    <h1>Arduino Sketch Uploader</h1>
    <button id="connect-button" onclick="connectSerial()">Mit COM-Port verbinden</button>
    <form action="/upload" method="post">
        <label for="text">Text eingeben:</label><br>
        <textarea id="text" name="text" rows="10" cols="50"></textarea><br><br>
        
        <label for="com_port">COM-Port:</label><br>
        <input type="text" id="com_port" name="com_port" placeholder="Z.B. COM3" required><br><br>

        <button type="submit">Hochladen</button>
    </form>

    {% with messages = get_flashed_messages() %}
        {% if messages %}
            <ul>
            {% for message in messages %}
                <li>{{ message }}</li>
            {% endfor %}
            </ul>
        {% endif %}
    {% endwith %}
</body>
</html>
Sobald ich einen Text eingebe und den Arduino Micro (COM3) über Web Serial API verbinde und dann auf Hochladen klicke, dauert es einen kleinen moment und dann kommt: Fehler: Hochladen fehlgeschlagen: avrdude: ser_open(): can't open device "32823": No such file or directory Failed uploading: uploading error: exit status 1.

Habe bereits schon länger nach lösungen gesucht auch mit ChatGTP aber komme auf kein treffer.
Danke und LG :)
Sirius3
User
Beiträge: 18250
Registriert: Sonntag 21. Oktober 2012, 17:20

Auf einen COM-Port in Deinem Browser kann nicht vom Server aus zugegriffen werden. Dein Server muß das Arduino-Programm an den Browser schicken, der das dann per COM-Port auf den Arduino laden kann.
https://github.com/louisfoster/awesome- ... me-ov-file
cuzimfuchs
User
Beiträge: 2
Registriert: Samstag 5. Oktober 2024, 23:13

Sirius3 hat geschrieben: Sonntag 6. Oktober 2024, 13:26 Auf einen COM-Port in Deinem Browser kann nicht vom Server aus zugegriffen werden. Dein Server muß das Arduino-Programm an den Browser schicken, der das dann per COM-Port auf den Arduino laden kann.
https://github.com/louisfoster/awesome- ... me-ov-file
Danke erstmals. Habe es versucht zu realisieren aber ohne erfolg.
Antworten