20/11/2024

Git: Wanneer is welke wijziging in een bestand ontstaan?

Filed under: — cybrarian @ 12:06 pm

Er is ergens een stomme bug veroorzaakt, waarschijnlijk lang geleden, en de oorzaak is onduidelijk; is het met een aanpassing aan de code gebeurd, of per vergissing door even in de editor in een verkeerd bestand iets te doen bij te snelle toetsaanslagen tijdens het werk?

Hoe kan git mij helpen dat moment terug te vinden?

Log path:

git log --path

bv:
git log -- Trypo/.src/TrypoForms/FDayReq.class

Daarmee kan je al zien wanneer daar de laatste aanpassingen gedaan zijn. Maar welke?

Bv de bug bevondt zich op regel 889 en betrof missende () bij een bewerking.

Log line:

git log -L(from),(to):(path)

bv:

git log -L887,891:Trypo/.src/TrypoForms/FDayReq.class

Dit geeft me de – en + regels, en hiermee kan ik snel vinden wat er juist gebeurd is.

19/11/2024

Git: mijn main en origin/main verschillen

Filed under: — cybrarian @ 11:09 am

De online versie van de master en mijn eigen lokale versie zijn uiteengelopen.

git checkout master
Switched to branch 'master'
Your branch and 'origin/master' have diverged,
and have 11 and 1 different commits each, respectively.

Ik kan het niet eenvoudig oplossen met push of pull:


git status
On branch master
Your branch is ahead of 'origin/master' by 11 commits.
(use "git push" to publish your local commits)
'
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git restore
..." to discard changes in working directory)
modified: .project
'
no changes added to commit (use "git add" and/or "git commit -a")
linuxuser@copyleft:~/Git/MyProject> git push
To gitlab.com:dev/myproject.git
! [rejected] master -> master (fetch first)
error: failed to push some refs to 'gitlab.com:dev/myproject.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
linuxuser@copyleft:~/Git/MyProject> git pull
error: cannot pull with rebase: You have unstaged changes.
error: please commit or stash them.

Ik haalde de main af in een test directory en met Kompare bekeek ik de verschillen om te checken wat er aan de hand was. Conclusie: mijn locale versie moet de nieuwe main/master worden.

Ik beveilig eerst mijn locale wijzigingen in een nieuwe branch:
(Als het over een kleine wijziging ging zou ik misschien git stash en git stash pop gebruiken)

git branch backup-mainlocal

Daarna even checken:

git status
On branch master
Your branch and 'origin/master' have diverged,
and have 12 and 1 different commits each, respectively. (...)

Ik zit nog in mijn master; gelijkzetten met de online versie:

git reset --hard origin/master
HEAD is now at efde303 Update ReadMe.txt with sourceforge tar.gz link

Ik zie de laatste wijziging daar in mijn ReadMe bestand.
Nu zijn beide versies terug gelijk:

git status
On branch master
Your branch is up to date with 'origin/master'.

en kan ik de wijzigingen toepassen uit mijn backup:

git merge backup-mainlocal
Merge made by the 'ort' strategy.
.component | 4 ++++
.gitignore | 19 +++++++++++++++++
.project | 3 ++-
.src/FMain.class | 54 +++++++++++++++++++++++++++++++++++++++++-------
.src/FMain.form | 4 ++--
...
Changes.txt | 15 ++++++++++++++
Help.txt | 2 +-
10 files changed, 441 insertions(+), 29 deletions(-)
create mode 100644 .component
create mode 100644 .gitignore

En online brengen:

linuxuser@copyleft:~/Git/MyProject/> git push
Enumerating objects: 7, done.
Counting objects: 100% (7/7), done.
Delta compression using up to 8 threads
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 627 bytes | 627.00 KiB/s, done.
Total 4 (delta 1), reused 0 (delta 0), pack-reused 0
To gitlab.com:dev/myproject.git
efde303..c950ea5 master -> master

Ok nu zijn ze terug synchroon.

7/11/2024

git reset –hard

Filed under: — cybrarian @ 12:35 pm

Ik moet een oud project oppikken dat ooit een aparte branch had waarin ik wil gaan werken, en ik moet de code up to date maken met de huidige stand.

git reset --hard origin/master

Als antwoord krijg ik:

HEAD is now at 01d4e38 fix conflicts

Ik vraag me af welke conflicts er dan zijn, want er worden er geen opgesomd. Normaal, als er conflicten zijn, wordt de aktie niet uitgevoerd, maar hier heb ik wel de bevestiging van “Head is now at ..”.

Bij nader inzien bleek “fix conflicts” de commit message te zijn van de laatse commit waar head nu op zit ….

11/10/2024

Eén bepaalde tak afhalen van git

Filed under: — cybrarian @ 10:17 am

Ik heb in een “dev” map een project “myproject” met ontwikkeling in Gambas3 op een pc met Kde-desktop.

Er is één tak van het project, branch “compat-lxde”, die ik ontwikkel op een ander toestel (Raspberry Pi) met een LXDE desktop; om de applicatie daar compatibel met die desktop te houden. Hierin neem ik bijna alles over van de “main”, behalve de dingen die niet werken in een LXDE desktop, die laat ik weg of pas ik aan.

De branches main en compat-lxde lopen dus grotendeels parrallel.

Soms wijzig ik iets op di Pi aan de lxde versie dat ook nuttig is voor main, en om dat binnen te halen wil ik ook de lxde code op mijn KDE-pc, maar op zo’n manier dat ik mij niet vergis met mijn gewone development, ik moet vermijden dat ik mijn gewone development aan het doen ben in de lxde versie bv.

Ik wil dus op mijn pc op een andere plek één bepaalde tak van mijn ontwikkeling apart bijhouden om die daar enkel te raadplegen.
Ik wil hier niet alle andere branches in hebben want die heb ik in mijn dev map, en daar werk ik ook aan.

Algemeen:
git clone -b --single-branch

Bv: als branch compat-lxde bestaat in het project:
git clone -b compat-lxde --single-branch https://gitlab.com/project/myproject.git

Ook op de Raspberry Pi kan het nuttig zijn om niet alle code binnen te halen, maar enkel de branch “compat-lxde” en bv “main” of “test”.

Nu kan ik op de pc in mijn dev directory de branches gebruiken om in te werken, bv in “feat-abc”, dan naar test, tot binnenhalen in main.

Ik ga naar de pi, integreer daar alles van main in de lxde branch. Ik doe terloops ook nog een kleine correctie (die terug naar test/main moet).

Ik ga op de pc naar de map met de lxde, haal de wijzigingen af (pull), kan die openen en knippen/plakken naar het project dat in de ontwikkelomgeving open staat in dev directory.

Normaal zit in de dev directory ook de lxde branch, en kan je daar diff’s met test/main doen en zo.

Om een enkele tak lokaal toe te voegen, doe:

git remote set-branches –add origin [remote-branch]
git fetch origin [remote-branch]:[local-branch]

17/9/2024

Gitlab rol veranderen van een lid van een project

Filed under: — cybrarian @ 11:20 am

Doel: een “Developer” mogelijkheid geven om de main te updaten.

De leden van een project kunnen hun rol hebben gekregen doordat ze lid zijn va een “group”, en die kan dan niet apart ingesteld worden voor een subproject van die group, bv devcopyleft/clTools
Rollen zijn in stijgende volgorde : Guest - Reporter - Developer - Maintainer - Owner

Ga naar de hoofdpagina van de group, bv devcopyleft.
Daar bij “Manage”, zie je de “Group Members”.
Als je de nodige rechten hebt (oprichter van de group: “owner”) kan je in de kolom “Role” klikken op de rol en die veranderen, bv naar “Maintainer”.
Nu kan hij “push” naar “main” doen.

16/9/2024

Raspberry Pi opstarten met programma op desktop

Filed under: — cybrarian @ 2:25 pm

De Rapsberry Pi laten opstarten in een bepaalde toepassing

Er is een map waar bij het opstarten gekeken wordt welke programma’s te starten:/home/pi/.config/autostart

ps: In documentatie vind ik ook nog andere gelijkaardige mappen: /home/pi/.config/lxsession/LXDE-pi/autostart

Het kan dat de map ~/.config/autostart nog niet bestaat;

  • op één pi bestond die niet en heb ik die gemaakt
  • op de andere bestond die wel en bevatte die een bestand LXinput-setup.desktop, met toetsenbord/muisinstellingen

Een programma dat je in deze map zet wordt automatisch uitgevoerd.

Opstarten met een zelfgeschreven applicatie in gambas3
– Vanuit de gambas programmeeromgeving (Gambas3-IDE) kan je een programma compileren tot uitvoerbaar, met de optie om een link op de desktop te maken; doe dat.
– de link kan je dan naar de autostart map verplaatsen (of kopieren).

9/9/2024

GitLab rechten met ssh keys

Filed under: — cybrarian @ 5:07 pm

Access denied

git clone https://gitlab.com/devgroep/myprojectterminal.git
Cloning into ‘myprojectterminal’…
Username for ‘https://gitlab.com’: mijngebruiker
Password for ‘https://mijngebruiker@gitlab.com’:
remote: HTTP Basic: Access denied. The provided password or token is incorrect or your account has 2FA enabled and you must use a personal access token instead of a password. See https://gitlab.com/help/topics/git/troubleshooting_git#error-on-git-fetch-http-basic-access-denied
fatal: Authentication failed for ‘https://gitlab.com/devgroep/myprojectterminal.git/’

Gebruik SSH keys
De site van gitlab legt dat goed uit;

https://docs.gitlab.com/ee/user/ssh.html

Kijk eerst of je al ssh sleutels hebt:

cd ~
cd .ssh/

Als je nog geen .ssh directory hebt, moet je checken of ssh geînstalleerd is, en/of genereer de ssh keys:

ssh-keygen -t ed25519 -C "mijngitlabaccountnaam"

Bij de vraag waar de key bewaren kan je normaal bevestigen:

Enter file in which to save the key (/home/user/.ssh/id_ed25519):

Als de .ssh map nog niet bestond, zal die nu gemaakt worden (geeft melding).

Nog wat bevestigen, en daarna vind je twee (nieuwe) bestanden, waarvan 1 de publieke sleutel is (die eindigt op .pub); en je kreeg ook wat randomart te zien…

The key’s randomart image is:

De inhoud van het pub bestand, inclusief opmerking, kopieren in de gitlab site bij je avatar, “edit profile, linkse kolom ssh keys”.. Add new key ..

De geldigheid kan je instellen als je wil.

Je ziet daarna dat de key is toegevoegd in je lijstje op https://gitlab.com/-/user_settings/ssh_keys

Nu vraagt git nog altijd mijn username en wachtwoord, maar nadien werkt bv het clonen wel.

23/3/2024

Git worktree

Filed under: — cybrarian @ 6:23 pm

Clean?
Een “cleane worktree” is je worktree na een commit/push of na een clone of pull.
Je ziet dat aan git status.

Dirty?
Vanaf je iets gewijzigd hebt, is het een “dirty worktree”, de toestand is “bezoedeld” door wijzigingen die nog nergens geregistreerd zijn.

Multiple?
Werken aan twee branches TEGELIJK.
(normaal schakel je om met git checkout branch1, hackhackhack, get stash, git checkout branch2, hackhackhack, git commit+push, git checkout branch1 ….)

Als je aan twee branches tegelijk wil werken kan je in een andere directory terug een clone doen van het project. Dan zit je met veel dubbele code, en moet je telkens beiden syncen. Je kan het Git zelf laten doen met git worktree, dan heb je minder ruimte nodig op de harde schijf, en verloopt het synchroon houden ook automatisch:
Bv: op een Raspberry Pi een “legacy” versie van software vergelijken met de huidige universele (die evolueert).

git worktree list
git worktree add MijnNieuweWerkboom *
en als je er mee klaar bent:
git worktree remove MijnNieuweWerkboom

Goede uitleg van het principe op https://tecadmin.net/git-worktrees-parallel-development-guide/
https://devdynamics.ai/blog/understanding-git-worktree-to-fast-track-software-development-process/

Eens die worktree gemaakt, zie je in je projectmap een map met de naam van de nieuwe worktree. En daarin staan terug dezelfde files als je al had in de directory erboven. Oei, dat was niet de bedoeling, die map hier in mijn projectcode te hebben.
(*) Belangrijk is om de directory op te geven waar die nieuwe worktree moet gezet worden bij git worktree add:

git worktree add ./../MijnNieuweWerkboom
of
git worktree add /home/username/directoryEtc

Terug verwijderen:
git worktree remove MijnNieuweWerkboom
git prune

git worktree add ./../MijnNieuweWerkboom
dan met
cd ..
cd MijnNieuweWerkboom
git status
git worktree list

Ik heb twee situaties gehad, de eerste was:
-1 In die directory zie ik een branch met de naam MijnNieuweWerkboom, terwijl ik die niet expliciet heb aangemaakt.

Normaal geef je als parameter een bestaande branch op (denk ik).

git worktree add ./../MijnNieuweWerkboom bestaandeBranch
(branch die ik daar wil om parrallel in te werken)
of
git worktree add /home/username/directoryEtc bestaandeBranch

-2 ik kreeg een foutmelding “invalid reference: bestaandeBranch”; misschien bestond die niet of had ik hem verkeerd geschreven.

-3: fatal: “.. is already checkout out at ..”
Dat is eigenlijk wel zo… Ik kon dit oplossen door eerst een andere branch aktief te maken:
git checkout otherbranch
git worktree add ../MijnNieuweWerkboom bestaandeBranch

.. preparing …
HEAD is now at .. (shows comment of commit)

Bij geval 1: In Gambas is de naam van de map ook de naam van het project, dus dat is nu plots ook veranderd.

Hmm, nog niet goed? Je kan bij het maken van een worktree (blijkbaar/soms) ook de naam van de nieuwe branch meegeven, verschillend van eender welke bestaande.

In mijn geval is het nu niet zo erg, je moet eventueel een nieuw configuratiebestand aanmaken, of het bestaande kopieren. Hierdoor kan je ze ook uit elkaar houden (bv voor de executable; handig dat de naam anders is).


Stash
git stash kan heel interessant zijn: je bewaart alleen je huidige veranderingen.

VRAAG: Dus als je twee gelijkaardige projecten hebt die enkel een beetje verschillen, maar die verschillen moeten blijven bestaan, dan kan je met stash je nieuwe werk bewaren (dat dan niet over die specifieke verschillen mag gaan), en die “toepassen” op eender welke andere branch, of je eigen branch als je dat nog niet gedaan had en toch was uitgecheckt.

hackhackhack
git stash wijzigingen op de LIFO
git stash show
git stash apply —-> this you can do on another commit; how?
git stash drop (laatste verwijderen)
git stash pop = apply + drop
git stash list
git stash clear (leegmaken)

git stash pop, ofwel git pop 0 (voor de laatste) git pop 1=voorlaatste enz. past de laatste stash to op de huidige worktree, en gooit hem daarna weg.

om “een stash” te verwijderen uit de “git stash list” doe je git stash drop i

Nu nog uitzoeken hoe ik een stash toepas op .. bv een ander worktree?


(Reeks Githandboek (nl)commando’s vbbranch, mergebranch zoeken/datumstashgit worktree GitLab vbSourceForge vbgit en gambas)

12/9/2023

Git merge opties (strategy)

Filed under: — cybrarian @ 12:03 am

Eenvoudige merges, samenvoegen van iets dat verder voorop is en eenvoudig toegevoegd wordt aan een achtergebleven tak, is gemakkelijk te begrijpen, maar soms is het ingewikkelder.

git merge [-n] [–stat] [–no-commit] [–squash] [–[no-]edit]
[–no-verify] [-s ] [-X ] [-S[]]
[–[no-]allow-unrelated-histories]
[–[no-]rerere-autoupdate] [-m ] [-F ]
[–into-name ] […​]
git merge (–continue | –abort | –quit)

merge strategiën
De verschillende merge “strategies” zijn recursive, resolve, octopus, ours, subtree

Je kan zelf de merge strategy opgeven met een parameter:
(ook bij git pull trouwens)

git merge -s recursive tak1 tak2

git merge -s resolve tak1 tak2

git merge -s octopus tak1 tak2 tak3 .. takn

git merge -s ours tak1 tak2 .. takn

git merge -s subtree takA takB

Type van strategie

– Expliciet
Dit is de standaard merge methode. Het betekent dat er een nieuwe “merge commit” gemaakt wordt. Dit toont waar de merge werd gedaan in de merge geschiedenis, en dat is niet altijd gewenst (omdat het de aandacht afleidt, ruis dus). Als je deze details niet in je merge history wil, zal je misschien explicit merge vermijden.

– Impliciet
Impliciete merge via rebase of fast-forward merge

– Squash
Squash on merge, meestal zonder expliciete merge

Recursive merge strategy options

ours, theirs, patience, diff-algorithim, ignore, renormalize (no-normalize, no-renames), find-renames=n, subtree

Er zijn veel mogelijkheden, en hoe moet je kiezen wat te gebruiken alvorens je ze doorgrondt?

2/9/2023

Git: Foute merge herstellen, checken met git reflog, pushen met force

Filed under: — cybrarian @ 8:24 pm

Een merge van twee branches (dev-hq en roadie) gedaan die verkeerd afloopt, bv omdat de versies meer verschilden dan je dacht (op beide was een stukje ontwikkeling gedaan ipv op één van beiden)? Je kan correcties gaan doen in de broncode, die door git voorzien is van merktekens als

< <<<< HEAD
======
>>>>>>> roadie

.. met daartussen brokken tekst van de verschillende versies.
Soms is het duidelijk, een klein verschil kan een eenvoudige correctie zijn, of een uitbreiding van een string of een commentaar. Dan kan je die onmiddellijk verbeteren met een .txt editor (zelfs buiten de normale programmeeromgeving).

Maar als de verschillen te groot zijn en/of je er niet aanuit kan, wil je misschien de “merge” operatie herstellen naar de toestand voordien.

Zolang je het conflict niet opgelost hebt, en niets kon pushen, niet gecomit hebt, kan je nog altijd terug met :

git merge --abort

Je kan info krijgen van git:

git reflog

Als je terug wil gaan naar de laatste gemeenschappelijke toestand, kan je die vinden met:

$ git merge-base dev-hq roadie
806f8ac3c61b1e55cdd5b53a0205b51d1d31387a

Dan kan je terug naar die toestand met

git reset 806f8ac3c61b1e55cdd5b53a0205b51d1d31387a

Unstaged changes after reset:
M .src/FConfigure.class
M .src/FConfigure.form

Om hem online te krijgen volstaat een gewone git push niet:

git push
To gitlab.com:stockpi/stockpiapp.git
! [rejected] dev-hq -> dev-hq (non-fast-forward)
error: failed to push some refs to ‘gitlab.com:stockpi/stockpiapp.git’
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: ‘git pull …’) before pushing again.
hint: See the ‘Note about fast-forwards’ in ‘git push –help’ for details.

git push --force

git push –force
Total 0 (delta 0), reused 0 (delta 0), pack-reused 0
remote:
remote: To create a merge request for dev-hq, visit:
remote: https://gitlab.com/stockpi/stockpiapp/-/merge_requests/new?merge_request%5Bsource_branch%5D=dev-hq
remote:
To gitlab.com:stockpi/stockpiapp.git
+ 8a060eb…806f8ac dev-hq -> dev-hq (forced update)

(zie bv https://www.atlassian.com/git/tutorials/undoing-changes/git-reset)
Julia Evans: “git rebase: what can go wrong?”

16/12/2022

Arduino neopixel LEDs

Filed under: — cybrarian @ 2:54 pm

De pixels kunnen gestuurd worden met waarden van 0-255 per RGB kleur.

Met als extreme waarden voor Rood, Groen, Blauw:

Rood is (255,0,0)
Groen is (0,255,0)
Blauw is (0,0,255)
Geel is (255,255,0)
Oranje is (255,165,0)

Maar ook tussenwaarden geven mooie resultaten..

Zacht geel (60,40,0), minder fel
Flauw blauw ( 0,50,0), geschikt om te laten zien dat er stroom is maar zonder veel licht te geven.
Fuchsia (150,20,20)

enz..

16/11/2022

SQL opvraging over verschillende databanken

Filed under: — cybrarian @ 9:43 am

Ja, je kan in 1 sql-statement een opvraging van verschillende databanken combineren (als je er toegang toe hebt met je account).

SELECT db1.table1.*, db2.table2.name FROM db1.table1, db2.table2 WHERE db2.table2.id=db1.table1.external_id

Je kan verschillende rechten hebben op de databases; bv op de ene tabel lees-wijzig-invoeg rechten, en op de andere alleen leesrechten.

Toepassing: database user planktonalfheim heeft enkel leesrecht op Alfheim2.application om de naam op te zoeken:

REVOKE ALL PRIVILEGES ON `Alfheim2`.* FROM 'planktonalfheim'@'localhost'; GRANT SELECT ON `Alfheim2`.* TO 'planktonalfheim'@'localhost';
REVOKE ALL PRIVILEGES ON `plankton`.* FROM 'planktonalfheim'@'localhost'; GRANT SELECT, INSERT, UPDATE, DELETE ON `plankton`.* TO 'planktonalfheim'@'localhost';

MariaDbServer
* Alfheim2

  • application
    – id
    – name

* plankton

  • issue
    – id
    – description
    – isactive
    – application_id

SELECT plankton.issue.*, Alfheim2.application.name FROM plankton.issue, Alfheim2.application WHERE plankton.issue.isactive=1 AND Alfheim2.application.id=plankton.issue.application_id

31/5/2022

Databank structuur versie bijhouden in databank?

Filed under: — cybrarian @ 6:50 pm

Database versioning. Brainstorm.

Ontwerp
Ik maak een applicatie (bv in Gambas3), en gebruik een mariadb databank om de gegevens op te slaan.
Ik exporteer de structuur en bewaar die mee in de broncode om dat databank terug op te kunnen bouwen.
De vorige wordt overschreven, alleen de huidige, bij de software passende versie databank.sql wordt hier bewaard. Door het versiebeheersysteem (Git), kan je teruggaan naar oudere software versies, en dan heb je daar ook altijd de bijpassende databank struktuur bij.

Verandering
Als er een verandering gebeurt aan de code en aan de “database structure”, moet ik ergens kunnen bijhouden welke versie van de database struktuur dit is (zeker als mogelijk verschillende applicaties of versies van software gebruikt worden om die aan te spreken).

Een logische plaats zou zijn: in de database zelf.

De wijziging aan de database moet kunnen gedetecteerd worden door de software; en als maar 1 software die databank gebruikt, zou de software die ook (automatisch) kunnen aanpassen/opwaarderen, of de juiste aanpassing kunnen suggereren.
Upgrade/Downgrade: als er een upgrade script is, ook een downgrade script voor ingeval onverwachte problemen (in productie).

Het zou goed zijn als de toepassing de databank struktuur checkt bij het opstarten, dan kan er geen te oude code draaien met een niet meer kloppende nieuwere versie van de databank.

De software moet dus ook weten voor welke versie van databank ze gemaakt is; bv met een constante gedefinieerd in Main “dBVersion = 10”.

Als er een “library” gebruikt wordt om de database te benaderen kan dat daarin.

Vorm
Hoe gedetailleerd moet de database struktuur versienummering zijn?
bv:
Db is aangemaakt, is versie 1, Db v1
Db is aangepast, extra tabel, Db v 2
Db heeft extra index gekregen, Db v2.1
Nog een extra index gekregen, Db v2.2
Extra velden in tabel, Db v 3.0
Extra velden krijgen index, Db v 3.1
Tabel bijgemaakt, Db v 4.0
Velden bijgemaakt daarin, Db v 5.0
Nog een tabel extra Db v6.0

De hoofdversie vereist overeenkomstige wijziging aan de code die de data gebruikt.
Een minor versienummer levert bv een praktische versnelling op, maar geen code wijziging?

Waarschuwing
– major versienummer verschil: waarschuwing en afsluiten/readonly (?).
– minor versienummer verschil: waarschuwing en verderwerken.

Bij major aanpassing:
– telkens de database structuur bij de broncode, dan kan in principe vanaf die struktuur vertrokken worden bij nieuwe installatie van het geheel (dus ook nieuwe databank).
– de code om de database op deze stand te brengen vanuit de vorige toestand.
Dus bij de developer moet de database-wijziging gebeuren met code, dezelfde die mee geleverd wordt als upgrade code voor de gebruiker. Dat zal niet altijd kunnen, als er dingen uitgeprobeerd worden bij development; maar uiteindelijk moet de developer dan toch de vorige volle versie terugzetten en een upgrade script maken tot de gewenste toestand.

Bij minor aanpassing:
– telkens de database structuur bij de broncode, blijft.
– ook deze aanpassing als code meeleveren.

History?
– in database een history bijhouden van in gebruik geweeste versienummers, met datum, updaternaam enz.

Best eens een test maken om dat uit te proberen…

5/4/2022

Scratch verdwenen?

Filed under: — cybrarian @ 1:58 pm

MIT killed the cat

Er is door MIT geen versie meer gemaakt voor Linux van de recentste Scratch programmeeromgeving (vanaf Scratch 3.0).

De community spreekt nu over Scratux.

https://snapcraft.io/scratux

https://scratch.mit.edu/discuss/topic/326943/

NB: Op Raspberry Pi OS blijkt Scratch 3 wel beschikbaar.

11/3/2022

Midnight Commander mcedit syntax highlighting

Filed under: — cybrarian @ 10:29 am

mcedit
Met de Midnight Commander Editor mcedit kan je redelijk comfortabel shell scripts en configuratiebestanden aanpassen op de commandolijn zonder speciale shortcuts te moeten leren.
Shell scripts en andere broncode teksten worden meestal herkend, en krijgen een kleurmarkering volgens betekenis: commando’s, sleutelwoorden, commentaar enz.
Helaas zijn die kleuren niet altijd even goed zichtbaar ten opzichte van de achtergrondkleur bv groen tov blauw.

Syntax highlighting snel uitschakelen: Ctrl-s

Terug ctrl-s om weer in te schakelen.

Keuze
Om de kleuren aan te passen moet je in het “hoofdprogramma” zijn, Midnight Commander zelf: mc.
In het menu Options, Appearance kan je kiezen uit een aantal kleur-instellingen, die een niet altijd veelzeggende naam hebben. Ze worden “skin” genoemd, je moet op de spatiebalk drukken om het menu te openen:

default
(is standaard met blauwe achtergrond)

mc46
is ook blauw en heeft hetzelfde leesbaarheidsprobleem met groen

Enkele donkere werken misschien beter:

dark
gotar

heeft een zachte zwarte achtergrond:

modarin256

of een zachte grijze achtergrond:

gray-green-purple256

Aanpassen

Opstarten met aangepaste kleuren:
mcedit -C "editnormal=lightgray,black:editbold=yellow,black:editmarked=black,cyan"

De instellingen worden bewaard (en kunnen aangepast worden) in:
~/.config/mc/ini

Standaard staat er:

[Colors]
base_color=
xterm-256color=
color_terminals=

Vul bv aan met:

[Colors]
base_color=editnormal=lightgray,black:editbold=yellow,black:editmarked=black,cyan

15/2/2022

Arduino’s seriele print data uitlezen

Filed under: — cybrarian @ 12:43 pm

Serial

Een Arduino bord heeft een programma dat (-bv om het te debuggen-) feedback geeft met print:

In de setup:
Serial.begin();

Je moet ook de snelheid opgeven, dus bv:
void setup() {
Serial.begin(9600);
}

In de code-loop:
Serial.println(someValue);

Bv in een loop:

void loop() {
Serial.println("Hello from Arduino..");
delay(1000);
}

De developer kan in de IDE de feedback zien met de tool “serial monitor”.

Losgekoppeld

Maar ook eens het programma loopt en de Arduino niet meer aan de programmeeromgeving hangt, kan je die seriële communicatie opvangen. Hang de usb-kabel aan een usb-poort van een Linux computer (Raspberry Pi, …).

1. Rechtstreeks vanuit het systeem/commandolijn
Om de hardware te benaderen moeten we root rechten hebben, ofwel telkens met sudo, ofwel:

su root

****

Werp een blik op de usb poorten:

lsusb

Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 003: ID 046d:c31c Logitech, Inc. Keyboard K120
Bus 001 Device 002: ID 046d:c077 Logitech, Inc. M105 Optical Mouse
Bus 001 Device 004: ID 2341:0043 Arduino SA Uno R3 (CDC ACM)
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

tty

Seriëel in de Linux (unix) wereld is “tty”; en er zijn heel wat seriële apparaten mogelijk:

ls /dev/tty*

/dev/tty    /dev/tty20  /dev/tty33  /dev/tty46  /dev/tty59    /dev/ttyS12  /dev/ttyS25
/dev/tty0   /dev/tty21  /dev/tty34  /dev/tty47  /dev/tty6     /dev/ttyS13  /dev/ttyS26
....
/dev/tty15  /dev/tty28  /dev/tty40  /dev/tty53  /dev/tty9     /dev/ttyS2   /dev/ttyS4
/dev/tty16  /dev/tty29  /dev/tty41  /dev/tty54  /dev/ttyACM0  /dev/ttyS20  /dev/ttyS5
/dev/tty17  /dev/tty3   /dev/tty42  /dev/tty55  /dev/ttyS0    /dev/ttyS21  /dev/ttyS6
...
/dev/tty2   /dev/tty32  /dev/tty45  /dev/tty58  /dev/ttyS11   /dev/ttyS24  /dev/ttyS9

stty

Het commando dat de afkorting is van “Set Teletype”:

stty – change and print terminal line settings

Gebruik:
stty [-F APPARAAT | --file=APPARAAT] [INSTELLING...]

Wat?
stty -F

-F, –file=APPARAAT te gebruiken apparaat in plaats van standaardinvoer

Speciale instellingen:
speed de snelheid van de terminal tonen

Dus:
stty -F /dev/ttyACM0 speed

9600

(vreemd ik zou verwachten 115200 ..)
Eens proberen of ik hem kan verzetten:

stty -F /dev/ttyACM0 speed 115200

9600

Terug opvragen:

stty -F /dev/ttyACM0 speed

115200

Lees nu uit:
cat /dev/ttyACM0

SCD30 Raw Data

Carbon Dioxide Concentration is: 930.56 ppm

SCD30 Raw Data

Carbon Dioxide Concentration is: 930.51 ppm

Carbon Dioxide Concentration is: 929.86 ppm

….

Dit is dezelfde uitvoer die je krijgt in de IDE.
Je kan de Arduino aan eender welke bereikbare* Linux-bak hangen en vanop afstand met ssh inloggen en uitlezen, naar een logfile laten sturen, enz…

* bekend ip-adres

2. Serieële communicatie ontvangen met software
Vanuit eigen geschreven software in python of gambas3 kan je de serieële poort uitlezen.

2.1 Python:
Grofweg gezegd: gebruik import serial, creeer een object met eigenschappen in parameters, en maak een lus met serialobject.readline()

2.2 Gambas: gebruik SerialPort, creëer een object, zet eigenschappen, maak methode _Read(), gebruik een lus of Timer om uit te lezen.

24/8/2021

Git: kladwerk en ongewenste wijzigingen (dirty directory)

Filed under: — cybrarian @ 12:10 pm

(Reeks Githandboek (nl)commando’s vbbranch, mergestashGitLab vbSourceForge vbgit en gambas)

Undo
Wijzigingen niet bewaren (die niet toegevoegd waren – ‘not staged’) en terugkeren naar de laatste goede toestand van de bestanden in je directory:

git reset --hard
Alle wijzigingen weggooien en terug beginnen met de vorige toestand van je ontwikkeltak.

git checkout -- vuilbestand
Eén bestand terugdraaien naar de laatste normale toestand van voor je (klad)werk.
Een typisch voorbeeld is een .settings bestand dat kan reageren op het starten van een programma; bv omdat het een teller bevat, of de laatste toestand van schermen of geopende documenten bijhoudt of zo.

git stash
Dit laat je toe de wijzigingen niet op te nemen in je programmeervoortgang, maar toch ook niet helemaal definitief weg te gooien; je zet ze opzij om voort te kunnen met je normale ontwikkeling.
Daarbij hoort nog:
git stash list : lijst van stash-items in tijdelijke editor (q=quit).
git stash show : diff
git stash apply : toepassen van deze stash op huidig werk.
git stash pop: toepassen van deze stash op huidig werk en uit stash halen.

Zie ook stash

12/4/2021

Git: in verkeerde branche gewerkt

Filed under: — cybrarian @ 4:03 pm

Ik zit ijverig te werken en nadien zie ik dat ik in de master branch bezig ben ipv de dev branch.
Ik heb nog geen git add of commit gedaan.
(in git status zie ik modified: BestandWaaraanIkBezigWas.class )
Ik kan natuurlijk alles weggooien en de master terugzetten op een vorig punt.

Maar ik wil de wijzigingen wel bijhouden, en ik wil die in de dev krijgen.

De aanbevelingen die ik lees gaan ongeveer zo:
– maak een nieuwe branch vanuit die master die je gewijzigd hebt (maar nog niet ge-commit), geef hem een tijdelijk naam bv tempdev.
git checkout -b tempdev
Switched to a new branch ‘tempdev’

– voeg eventueel nieuwe bestanden toe (niet nodig als je alleen “modified” hebt), en commit al je werk:
git add .
git commit -m "some new work"

Als ik nu terug ga (git checkout master) en daar git status vraag, geeft die geen modified bestanden meer.

– check of je de dev branch hebt:
git branch -l
master
* tempdev

Als je de dev branch niet hebt, kijken of hij er remote wel is:
git branch -lr (opgelet dit kan een vertekend beeld geven als die recent is bijgemaakt en je niet hebt bijgewerkt met fetch…)

origin/HEAD -> origin/master
origin/master

Of git branch -a om beiden te zien.

Dus eerst synchroniseren met online:
git fetch

remote: Enumerating objects: 32, done.
remote: Counting objects: 100% (28/28), done.
remote: Compressing objects: 100% (16/16), done.
remote: Total 16 (delta 12), reused 0 (delta 0)
Unpacking objects: 100% (16/16), done.
From git://git.code.sf.net/p/myproject/code
* [new branch] dev -> origin/dev
0c4e870..b8c15dc master -> origin/master

git branch -rl
origin/HEAD -> origin/master
origin/dev
origin/master

Beter!
– schakel naar dev branch en merge die met devtemp (importeert de devtemp wijzigingen).
git checkout dev
git merge tempdev

– commit en push zodat de (online) “remote” dev branch is bijgewerkt.
– schakel naar die je master en reset hem naar de laatste versie (van remote halen dus? Nee gebeurt lokaal): git reset --hard HEAD.

Stash
Misschien korter/handiger: gebruik “stash”, dat de wijzigingen lokaal even opzij zet (om ze al dan niet nadien toe te passen):

git stash
git checkout dev
git stash apply

(Reeks Githandboek (nl)commando’s vbbranch, mergebranch zoeken/datumstashGitLab vbSourceForge vbgit en gambas)

12/1/2021

Programmeerbare led-boom; voorbeeld-led-loopjes

Filed under: — cybrarian @ 10:29 pm

Zie vorig artikel Nano-programmeerbare kerstboom

Als de hardware geïnstalleerd is, kan je spelen met de broncode in de Arduino IDE, gemakkelijkst is om te beginnen van een voorbeeldprogramma waar een element in zit dat je wil verkennen.

Behalve voor het beschreven bord-met-leds geldt veel van de software voor heel wat reeksen van led’s, met als ledstrip-lengte een aan te passen getal (bv #define LEDCOUNT 12)
Om het effect van de drie kleuren te verstaan: zoek op internet naar de afbeelding van een “color wheel for light”.

Om vat te krijgen op de juiste led, maken we eerst een programma dat de leds afloopt in volgorde van de nummering van het bord (begint bij nul).

We laten de rode led op de Nano mee- (of eerder tegen-) knipperen als controle.

Inhoud:

  • Eén led loopt rond tussen donkere leds
  • Eén led loopt rond in een gekleurde kerstboom
  • Een ribbe van de kerstboom heeft verschillende kleuren, draait weg naar de spits toe.
  • Bauw zwaailicht

Gemeenschappelijk is altijd het invoegen van de Adafruit NeoPixel bibliotheek:
(nota: de < en > tekens hebben een spatie gekregen die er uit moet)

#include < Adafruit_NeoPixel.h >
#define PIN 9
#define LEDCOUNT 12

En bijna altijd heb je een index of teller nodig:
int i=0;
… (* soms komt hier dan bv een array met led-volgnummers of andere definities)
Adafruit_NeoPixel strip = Adafruit_NeoPixel(LEDCOUNT, PIN, NEO_RGB); // + NEO_KHZ800);

En dan een algemene setup code die de leds initialiseert:
void setup() {
// initialize digital pin LED_BUILTIN as an output.
pinMode(LED_BUILTIN, OUTPUT);
strip.begin();
strip.show(); // Initialize alle pixels 'off'

en daarna komt de oneindige programmalus “loop”:

void loop() {
// allerlei code, met een if of select voorwaarde of een andere herhaling
// dikwijls voorzien van een rustpauze van een aantal milliseconden:
delay(1000);
}

Eén led loopt rond tussen donkere leds

De rode led op het Nano bord pinkt om de programmaloop aan te tonen (mag er dus uit)

void loop() {
  digitalWrite(LED_BUILTIN, HIGH);   // led op Nano aan
  delay(250);                       // even houden
  digitalWrite(LED_BUILTIN, LOW);    // led op Nano uit
  delay(250);                       // even wachten voor
  // boom
// led i kleursterktes (rood, groen, blauw)
  strip.setPixelColor(i, 10, 10, 200);
  strip.show();
  delay(1000);
  strip.setPixelColor(i, 0, 0, 0);     // led i terug uit
  i++;                        // volgend led tot laatste..
  if(i > LEDCOUNT) {
    i=0;                        // terug naar eerste
  }
}

Conclusie: led 0 staat onderaan op de boom, op de ribbe diagonaal aan de overkant van de aan-uit schakelaar (voor de batterij), waar eigenlijk C/5 het dichstbij staat.

A	B	C	D
			
2	8	3	9
1	7	4	10
0	6	5	11

Eén led loopt rond in een gekleurde kerstboom
Richting: van 0 naar 11.

void loop() {
  digitalWrite(LED_BUILTIN, HIGH);   // bord led knippert tegen; aan
  delay(250);                       // houden..
  digitalWrite(LED_BUILTIN, LOW);    // uit
  delay(250);    // pauze alvorens led i te wijzigen;
  strip.setPixelColor(i, 10, 10, 200);    // led nummer i blauw
  strip.show();
  delay(1000); geniet
  strip.fill(strip.Color(0, 32, 0), 0, 12); // Kerstboom terug groen
  strip.show();
  delay(500);                       // even houden zo
  i++;  // schuif door naar nummer volgende led tot laatste
  if(i > LEDCOUNT) {
    i=0; // dan terug naar eerste
  }

Rond de boom …

Met het volgen van de leds zoals ze intern genummerd zijn, worden de ribben van de boom-piramide gevolgd, van onder naar boven en over de top terug naar onder (zie boven).

Maar wij willen ze zo laten lopen:

A	B	C	D
			
8	9	10	11
4	5	6	7
0	1	2	3

We laten niet de led-nummer optellen, maar wel de index in een rij van led-nummers.

0	6	5	11	1	7	4	10	2	8	3	9

In de definities boven de setup moeten de volgorde van het aanspreken van de pixels vooraf vastgelegd worden om gemakkelijk te kunnen rondlopen:

 int ledPins[] = {
    0, 6, 5, 11, 1, 7, 4, 10, 2, 8, 3, 9
  };

Pinkende ribben, rond-uitloop naar top

  void loop() {
  digitalWrite(LED_BUILTIN, HIGH);   // bord led knippert tegen; aan
  delay(250);                       // houden..
  digitalWrite(LED_BUILTIN, LOW);    // uit
  delay(250);    // pauze alvorens boom te wijzigen;
  strip.setPixelColor(ledPins[i], 200, 200, 0);    // pixel i aan, geel
  strip.setPixelColor(ledPins[i+4], 40, 40, 255);    // pixel op volgende laag boven blauw
  strip.setPixelColor(ledPins[i+8], 150, 20, 20);    // pixel op daaropvolgende laag rood
  strip.show(); // pixelnummers boven LEDCOUNT geen probleem, worden onzichtbaar
  delay(1000); pauze voor kleur terug uit; m.a.w. boom volledig kleuren;
  strip.fill(strip.Color(2, 50, 2), 0, 12); // Kerstboomgroen, bv 2, 50, 2 of 0, 32, 0
  strip.show();
  delay(100);                       // wachtebeke
  i++; // opschuiven tot laatste led, 
  if(i >= LEDCOUNT) {
    i=0; //  dan opnieuw
  }
}

Blauw zwaailicht

 digitalWrite(LED_BUILTIN, HIGH);   // led op bord aan (voltage hoog)
  delay(30);                       // wacht even
  digitalWrite(LED_BUILTIN, LOW);    // led op bord uit (voltage laag)
  delay(30);                       // wacht even


speel met deze delays (en die op het einde) voor de snelheid van het ronddraaien…

 strip.fill(strip.Color(4, 4, 25), 0, 12); // zwak blauw licht tussendoor
  strip.show();
  strip.setPixelColor(ledPins[i], 2, 2, 255);    // turn pixel on, ? color
  strip.setPixelColor(ledPins[i+4], 2, 2, 254);    // turn pixel on, ? color
  strip.setPixelColor(ledPins[i+8], 2, 2, 253);    // turn pixel on, ? color
  strip.show();
  delay(70);                       // wait for ..

De +4 en +8 zorgen ervoor dat de boven elkaar liggende leds samen gebruikt worden.
De waarden voor de kleuren zijn een tikje anders gezet, waardoor je boven/onder kan herkennen

  i++;
  if(i >= LEDCOUNT-8) {
    i=0;
  }


Dit laatste stuk zorgt ervoor dat het licht, eens helemaal rond, terug bij de eerste ribbe begint. Voor een politie-zwaailicht effect kan je de delay tijden korter zetten.

Veel plezier…

9/1/2021

Nano-programmeerbare kerstboom

Filed under: — cybrarian @ 12:35 am

Het ontbrekende handboek
(mijn doel is er een universeel monitoring apparaat van te maken: geluidsniveau, temperatuur, netwerkaktiviteit, …)
Een weinig gedocumenteerd object (Arexx creatie) en verkocht in verschillende vormen/versies op ondermeer Duitse webwinkels als Reichelt en Conrad (Als “MakerFactory”);

Voordeel: Je kan kiezen om hem:

  • gewoon aan te steken en alles blauw-blauw te laten (Dat is de teststoestand bij opstarten: alle leds blauw, beetje koud hard blauw licht maar leuk in industrieële omgeving en de leds geven veel licht (dat belooft voor de batterij..).
  • te voorzien van een micro:bit. De micro-bit kan je dan weer voorzien van een programma dat je afhaalt, en waarmee je de kleurtjes van de kerstboom laat varieren, rondlopen, verkleuren enz. Een micro:bit van de eerste versie volstaat. Je kan dan ook de rest van de micro:bit aansturen in je programma, voor het deel van de leds van de kerstboom moet je de Neopixel bibliotheek aanroepen voor een ledstrip van 12 leds RGB. Je kan bv tegelijk de temperatuur weergeven op de leds van de micro-bit, scrollend, en de lichtjes van de boom laten verlopen van kleur tegen een zelfgekozen tempo.
  • te voorzien van een bijgeleverde “arduino-compatibele” nano die je in een voet kan steken die je op de printplaat moet solderen. Op het ene van de twee papiertjes die mee in de doos zitten, staat dat je de batterijhouder moet verwijderen (hoe?) en dan de ic voet op het bord solderen, en de batterijhouder vastsolderen. Daarna “programmeren als WS-2812” is het enige wat de erg summiere handleiding op het tweede bladje er verder over zegt.
  • De bijgeleverde nano bevat standaard wel een demo: zachtjes opkomende en weer uitdovende kleur van de hele boom; groen, rood, blauw. Als je je eigen programma’s er in laadt, is deze natuurlijk weg.

Er wordt in alle talen verwezen naar “lesboeken en werkbladen met oefeningen en voorbeelden”, maar wel zonder te zeggen hoe of waar; ik heb ze online niet gevonden.

Micro:bit
De micro:bit is het gemakkelijkst te gebruiken, je moet hem maar in de speciale sleuf steken, en hij is onmiddellijk bruikbaar.

* Zelf bijeen puzzelen

BBC Micro:bit
WS-2812

Online bronnen:
* Een zip-bestand met een aantal “programma’s” om te downloaden:
software-2195092-makerfactory-mf-6585276-christmas-tree-mobile-kerstboom.zip

Uitgepakt geeft dat:

└── Software
    ├── Arduino
    │   ├── VU_meter
    │   │   └── VU_meter.ino
    │   └── Zwaailamp
    │       └── Zwaailamp.ino
    └── Microbit
        ├── analog_read_led.hex
        ├── analog_read_led_log.py
        ├── analog_read_led.py
        ├── led_and_button_test_2boards.hex
        ├── led_and_button_test_2boards.py
        ├── led_and_button_test.hex
        ├── ledtest.hex
        └── README.txt

5 directories, 10 files

Namen als “VU-meter”? “Zwaailamp”? Ik had eerder iets ivm kerstboom verwacht, maar ja…
* Aankoppelen
Sluit de micro:bit aan met de USB kabel aan de computer. Het ziet eruit alsof je een usb-drive aansluit, je kan die openen en ziet bestanden staan.
De uitvoerbare programma’s uit de Micro:bit directory van de download kan je naar de usb-Micro:bit kopiëren, je ziet onderaan een gele led flikkeren terwijls ze worden opgepikt door de Micro:bit; als dat stopt verdwijnt het bestand uit die usb-micro:bit map en start het programma met de uitvoering of wacht op bv de druk op een knop.

* Micro:bit programmeren
Bij Microbit zie je bestanden met uitgang
.hex: dat is het uitvoerbare bestand.
.py : dat is de wijzigbare broncode in python
Het is de broncode in python die nadien gecompileer wordt tot het hex bestand, dat kan je lokaal of via een website, waar je als download een .hex krijgt.

Je zou verwachten dat er telkens een broncode bestand is (.py) en daarvan een gecompileerde versie (.hex).
Helaas:

analog_read_led.py
analog_read_led.hex

analog_read_led_log.py
led_and_button_test_2boards.py
led_and_button_test_2boards.hex

led_and_button_test.hex
ledtest.hex

Gelukkig is er het README.txt bestand om alles te verduidelijken:

analog_read_led.hex VU meter
led_and_button_test.hex Looplicht. Met indrukken knop veranderd smiley op display microbit en worden leds rood ipv blauw.
led_and_button_test_2boards.hex Zelfde, echter nu met 16 LEDS (tweede board aangekoppeld via J2)

Euh??

Uitproberen van de .hex (en bekijken van .py indien beschikbaar);
* analog_read:
– Er brandt: 1 kant 3 blauwe leds; overkant bovenste blauwe led; andere kant onderste led groen: knippert onregelmatig (analoog? Maar op basis van wat? Random? Pin0? Ik krijg geen verandering in het patrook van knipperen.
– In de code valt me op dat er gewerkt wordt met pixelcount van 8, terwijl we er twaalf hebben.

* led_and_button_test.hex:
– op de micro:bit staat een sip kijkende smiley “:(” en er branden 3 blauwe leds op 1 ribbe, en 1 blauwe led op de tegenoverliggende. Er loopt 1 led rond op 8 leds die niet branden. Als je op de Micro:bit knop A indrukt, verandert de kleur van de rondlopende led naar rood. Als je loslaat terug naar vorige toestand.
– we hebben hier geen broncode van, maar de beschrijving is wel een beetje te volgen, waarschijnlijk ook een verkeerd aantal leds gedefinieerd voor deze boom.

* ledtest.hex:
– doet alle leds blauw branden, net alsof je de boom zonder micro-bit zou aanzetten.
– geen broncode.

* led_and_button_test_2boards
– Micro:bit geeft sip gezicht; doet verder een enkele blauwe led rondlopen : van beneden naar boven, over de top terug naar beneden. Even pause (ongeveer 4 tellen). Op de andere ribben ook weer van beneden naar boven en over de top naar beneden; dan ineens terug naar uitgangspositie. Als je knop A indrukt op de micro:bit verandert het gezicht naar een smiley en de kleur die rondloopt naar rood, zolang je de knop ingedrukt houdt.
– broncode spreekt van pixelcount 16; dus dat verklaart de 4 tellen waar we niets zien gebeuren?


Arduino Nano:

Om de “arduino” Nano te monteren moet de batterijhouder verwijderd worden en dat ziet er op het eerste zicht gemakkelijk uit, want die is vastgezet met 2 boutjes; losdraaien en klaar? Neen. De batterijhouder zit ook met 2 pinnen vast(gesoldeerd?) op het bord, nl waarmee de stroom doorgegeven wordt. Die moet je dus voorzichtig los solderen, want nadien moet hij er terug aan. Het nano-blaadje uitleg geeft al toe dat de voet voor de nano-processor niet past op het bord van de kerstboom: je moet 1 paar tegenoverliggende voetjes ombuigen. Daarna moet je de voet vastsolderen (volgens de handleiding met de nano erin, is dat wel voorzichtig?), en daarna moet je de nano er uit halen en de batterijhouder terug vastsolderen. Alleen spijtig dat je daar zo goed als niet meer aankan, want de voet zit in de weg nu.

De handleiding zegt: “Als de Arduino Nano op de print gesoldeerd is, kun je de kerstboom niet meer met de Micro:bit gebruiken”, maar de Arduino is niet vastgesoldeerd (past ook niet rechtstreeks), enkel de voet. En daardoor kan je de Nano er wel uithalen; en – vermoed ik- terug gebruiken met de Micro:bit (misschien een overblijfsel van een vorige versie?).

* Arduino software
Installatie (hier op Ubuntu 18.10):
Arduino “IDE” kan je downloaden voor Linux, bv in versie 1.8.13:
https://downloads.arduino.cc/arduino-1.8.13-linux64.tar.xz
Uitpakken, …

~/IOT-SBC/arduino-1.8.13-linux64/arduino-1.8.13$ ls
arduino examples java reference tools-builder
arduino-builder hardware lib revisions.txt uninstall.sh
arduino-linux-setup.sh install.sh libraries tools

en het installatieprogramma draaien:

~/IOT-SBC/arduino-1.8.13-linux64/arduino-1.8.13$ sudo ./install.sh

Adding desktop shortcut, menu item and file associations for Arduino IDE…

Starten met “arduino” (op de commandolijn) of uit het menu of link op de desktop.

* Configuratie
Je moet ervoor zorgen dat je toegang hebt tot de hardware van je computer, meer bepaald de seriële poort. Dat kan bv door je gebruiker aan een bepaalde groep toe te voegen die toegang heeft tot die seriële poorten. Of de luie, verwerpelijke, onveilige manier is de arduino software te starten met root rechten: sudo arduino.
Als het onmiddellijk lukt een een voorbeeldprogramma uit het menu “Files, Examples, Basic, Blink” te laden en dat naar de Nano te sturen (met de upload pijl), de Nano-led flikkert, en er begint een LED te pinken, dan lijkt het ok.
De software is gemaakt voor een heel groot aantal Arduino borden (en compatibelen), die toch allemaal wat onderling verschillen, bv van mogelijkheden, processor, communicatiechips enz.
In de software moet je mogelijk wat instellingen doen om die aan te passen aan het apparaatje dat je zelf hebt. Ik denk niet dat het kwaad kan, en ik heb het in ieder geval gedaan, om te proberen tot je een instelling vindt die werkt.
Voorbeeld:
-Tools, Board: Arduino Nano – je moet niet aangeven dat het geen echte Arduino is..
-Tools, Processor: ATmega 328P (old bootloader) – “old bootloader” maakte bij mij het verschil
-Tools, Port: /dev/TTYusb0 – kan bv op /dev/TTYs0 staan
-Programmer: Arduino as ISP
Zo lukte het doorsturen van het programma en daarna werkte de knipperende led (op de Nano zelf).

Bibliotheekbeheerder
In menu Tools, Library Manager, bij “Adafruit” zoeken naar “NeoPixel” (hier 1.7.0), druk “install”.

Als je een terminal venster openhebt zie je daar:

Installer Thread] Connect to https://downloads.arduino.cc/libraries/github.com/adafruit/Adafruit_NeoPixel-1.7.0.zip, method=GET, request id=AA5FE6A11AC24BAA
2021-01-11T23:32:53.124Z INFO c.a.u.n.HttpConnectionManager:157 [LibraryManager Installer Thread] Request complete URL="https://downloads.arduino.cc/libraries/github.com/adafruit/Adafruit_NeoPixel-1.7.0.zip", method=GET, response code=206, request id=AA5FE6A11AC24BAA, headers={null=[HTTP/1.1 206 Partial Content], Server=[cloudflare], Content-Range=[bytes 0-68907/68908], Last-Modified=[Thu, 05 Nov 2020 20:35:25 GMT], X-Amz-Cf-Id=[B_S_zxqMpHC22E8beW3D2fzEpQ_U0-4tpC7F1ZgKRmxFLMHJiQberQ==], Set-Cookie=[__cfduid=d583a54e468bb8f35f5c2779301d625a91610407973; expires=Wed, 10-Feb-21 23:32:53 GMT; path=/; domain=.arduino.cc; HttpOnly; SameSite=Lax], Content-Length=[68908], Age=[1257687], cf-request-id=[079564a8da0000f951dfb56000000001], Content-Type=[application/zip], X-Cache=[Miss from cloudfront], CF-Ray=[61027087c9b0f951-BRU], X-Amz-Cf-Pop=[BRU50-C1], Connection=[keep-alive], x-amz-version-id=[6Yh0xZLsEcmrSOLunFynfok9_0CfS0_4], Date=[Mon, 11 Jan 2021 23:32:53 GMT], Via=[1.1 99578e20c0b3a3e3de02b1f1fe508f98.cloudfront.net (CloudFront)], x-amz-replication-status=[COMPLETED], CF-Cache-Status=[HIT], Cache-Control=[private], ETag=["4eaaaa04f12af651fe17d3f5c4fafbc6"], Vary=[Accept-Encoding], x-amz-request-id=[081CA622C45AA4DD], x-amz-id-2=[v6sY2mUeZxs4GmWgvhuYtTVHb4ll/YLu7BOz6dbfpYY6Ey8xCYshTYf1TNM6XqbigeTh2Bv+DhQ=], Expect-CT=[max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"]}

Als je daarna terug in menu Tools, Manage Libraries naar deze library gaat, zie je hem staan als “installed”.

Sketch, Include Library, selecteer Adafruit NeoPixel; er wordt bovenaan een lijn ingevoegd met:

 # include < Adafruit_NeoPixel .h  > 

Je hebt de pin nodig waaruit gestuurd wordt:
#define PIN 9

Definieer de strip:
Adafruit_NeoPixel strip = Adafruit_NeoPixel(12, PIN, NEO_RGB);

Daarna in de setup function (initialiseren op af):

strip.begin();
strip.show();

en dan in de programma loop, bv zet pixel nul (eerste in de rij) op rood:

strip.setPixelColor(0, 255, 0, 0); //turn pixel on red green blue
strip.show();

Of voor een hele reeks leds, “fill” met gebruik van de functie “Color” om de kleur te maken:

strip.fill(strip.Color(12, 64, 0), 0, 12);
strip.show();

Samengevat:
# include
#define PIN 9
Adafruit_NeoPixel strip = Adafruit_NeoPixel(12, PIN, NEO_RGB);
#
void setup() {
// put your setup code here, to run once:
strip.fill(strip.Color(12, 64, 0), 0, 12);
strip.show();
strip.begin();
strip.show();
}
#
void loop() {
// put your main code here, to run repeatedly:
strip.setPixelColor(0, 255, 0, 0); //turn pixel on red green blue
strip.show();
}

en dan uploaden …

Als de test werkt kan het echte programmeerwerk beginnen…

Succes!

Powered by WordPress