CH32v003 – deel 1 – Bordje met F4P6 variant

In de laatste editie van Elektor stond een opsomming van RISK-V processors en bordjes. Daar werden o.a. ik o.a. deze goedkope CH32v003 bordje genoemd. Tevens een aankondiging dat er in een van de volgende edities van het blad een artikel aan besteed wordt.

CH32v003

Voor de grap een paar besteld (á €1,49) en die heb ik zojuist binnengekregen.
Op het bordje zit een CH32V003 F4P6 -chip


Op het bordje zit ook een USB-C connector, maar … daarmee zijn ze blijkbaar niet te programmeren; die is alleen maar voor de stroomvoorziening. Voor het programmeren heb je een WCH LinkE programmer nodig. Daarnaast heb je nodig een tool chain van WCH, een open source tool chain, (hier ook op Hackster), maar ook vanuit de Arduino IDE zou het moeten kunnen.
Hier wordt uitgelegd hoe te werken vanuit PlatformIO en hier een uitleg om e.e.a. te doen vanuit de Arduino IDE, wat misschien een betere keuze is.
Blijkbaar is voor het programmeren, naast 3V3 en Gnd, slechts een draadje naar de DIO-pin op het bordje nodig.

Gisteren de WCH LinkE besteld voor €4,69! Dus nu weer even afwachten.

Hier nog wat documentatie:

Er blijkt een aantal versies van de programmer in omloop te zijn, namelijk de WCH-LinkE, de WCH-DAPLink en de WCH-LinkW. Ik heb blijkbaar de WCH-LinkE, de eerste genoemd in de WCH-Link User Manual deze dus:

De WCH-LinkE, die ik heb

Er zijn maar drie draadjes nodig tussen den programmer en de processor.

De twee aan elkaar geknoopt

Na insteken van de “USB-stick” zie je onder Apparaatbeheer in Windows de WCH-LinkE verschijnen als WCH-LinkRV.

Programmeren vanuit de Arduino IDE lukte niet en gaf een foutmelding: de programmer werd niet gevonden.

Met het programma WCH-LinkUtility kan je de instelling van de LinkE bekijken (knop “Get” rechts-onderaan). De actieve mode bleek WCH LinkDAP-WINUSB te zijn. Wel eerst de juiste chip ingeven onder “Core” (RISK-V) en “Series” (CH32V003).

De mode veranderd naar “WCH-LinkRV” en het programmeren vanuit de Arduino IDE lukte nu wel: zie hieronder. In de Arduino IDE, onder “Hulpmiddelen”, stond bij mij als “Upload method” WCH-SWD al aangevinkt.

#define LED_PIN1 D3          // PC1, Arduino D3
#define LED_PIN2 D4
#define LED_PIN3 D5
#define LED_PIN4 D6
#define LED_PIN5 D7
#define LED_PIN6 D8

void setup() {
  pinMode(LED_PIN1, OUTPUT);
  pinMode(LED_PIN2, OUTPUT);
  pinMode(LED_PIN3, OUTPUT);
  pinMode(LED_PIN4, OUTPUT);
  pinMode(LED_PIN5, OUTPUT);
  pinMode(LED_PIN6, OUTPUT);
}

void loop() {
  digitalWrite(LED_PIN1, HIGH);
  delay(500);
  digitalWrite(LED_PIN1, LOW);
  //delay(500);

  digitalWrite(LED_PIN2, HIGH);
  delay(500);
  digitalWrite(LED_PIN2, LOW);
  //delay(500);

  digitalWrite(LED_PIN3, HIGH);
  delay(500);
  digitalWrite(LED_PIN3, LOW);
  //delay(500);

  digitalWrite(LED_PIN4, HIGH);
  delay(500);
  digitalWrite(LED_PIN4, LOW);
  //delay(500);

  digitalWrite(LED_PIN5, HIGH);
  delay(500);
  digitalWrite(LED_PIN5, LOW);
  //delay(500);

  digitalWrite(LED_PIN6, HIGH);
  delay(500);
  digitalWrite(LED_PIN6, LOW);
  delay(500);
}

Zoals wel vaker is het even zoeken naar de juiste pinnummers: een LED aangesloten op pin PC1 van het bordje is volgens de Arduino IDE nummer D3. Zie hieronder voor de rest van de nummering.

Bron

Vervolgens ook deze aardige joystick-module uitgeprobeerd. Het lijkt me een handig dingetje om door een menu te wandelen en om vervolgens een keuze te maken. Het bestaat feitelijk uit een compact bordje met in totaal zeven knopjes. In het midden een knop met vijf contacten: 4 voor de verschillende richtingen: up, down, left en right en 1 voor het indrukken van de knop in de rust/middenstand. Daarnaast nog een ‘SET’ en een ‘RST’ knopje.
Ik heb zes van de zeven knopjes op de CH32V003 aangesloten , verbonden met de PD-pinnen.

Joystick-module; €1,18 per stuk
#define LED_PIN1 D3          // PC1, Arduino D3
#define LED_PIN2 D4
#define LED_PIN3 D5
#define LED_PIN4 D6
#define LED_PIN5 D7
#define LED_PIN6 D8

#define u_Btn D12
#define d_Btn D13
#define l_Btn D14
#define r_Btn D15
#define mid_Btn D16
#define set_Btn D17
//#define rst_Btn XXX


void setup() {
  pinMode(LED_PIN1, OUTPUT);
  pinMode(LED_PIN2, OUTPUT);
  pinMode(LED_PIN3, OUTPUT);
  pinMode(LED_PIN4, OUTPUT);
  pinMode(LED_PIN5, OUTPUT);
  pinMode(LED_PIN6, OUTPUT);

  pinMode(u_Btn, INPUT_PULLUP);
  pinMode(d_Btn, INPUT_PULLUP);  
  pinMode(l_Btn, INPUT_PULLUP);  
  pinMode(r_Btn, INPUT_PULLUP);  
  pinMode(mid_Btn, INPUT_PULLUP);  
  pinMode(set_Btn, INPUT_PULLUP);  
  //pinMode(rst_Btn, INPUT_PULLUP);  
}

void loop() {
  int u_Btn_Status = digitalRead(u_Btn);
    if (u_Btn_Status == LOW){
      digitalWrite(LED_PIN1, HIGH);
      delay(500);
      digitalWrite(LED_PIN1, LOW);
      //delay(500);
    }
  int d_Btn_Status = digitalRead(d_Btn);
    if (d_Btn_Status == LOW){
      digitalWrite(LED_PIN2, HIGH);
      delay(500);
      digitalWrite(LED_PIN2, LOW);
      //delay(500);
    }
  int l_Btn_Status = digitalRead(l_Btn);
    if (l_Btn_Status == LOW){
      digitalWrite(LED_PIN3, HIGH);
      delay(500);
      digitalWrite(LED_PIN3, LOW);
      //delay(500);
    }
  int r_Btn_Status = digitalRead(r_Btn);
    if (r_Btn_Status == LOW){
      digitalWrite(LED_PIN4, HIGH);
      delay(500);
      digitalWrite(LED_PIN4, LOW);
      //delay(500);
    }
  int mid_Btn_Status = digitalRead(mid_Btn);
    if (mid_Btn_Status == LOW){
      digitalWrite(LED_PIN5, HIGH);
      delay(500);
      digitalWrite(LED_PIN5, LOW);
      //delay(500);
    }
  int set_Btn_Status = digitalRead(set_Btn);
    if (set_Btn_Status == LOW){
      digitalWrite(LED_PIN6, HIGH);
      delay(500);
      digitalWrite(LED_PIN6, LOW);
      //delay(500);
    }
}

Ook dat werkt zoals het zou moeten. AL met al lijkt deze CH32V003 een prima en goedkoop alternatief voor een Arduino of ESP32.

Geef een reactie

Je e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *

Deze site gebruikt Akismet om spam te verminderen. Bekijk hoe je reactie gegevens worden verwerkt.