Update!
Ik zal weer eens een update doen van de voortgang, want die is er zeker. Eerder vertelde ik dat ik een MCP3008 had besteld voor extra analoge kanalen, en die werkt ondertussen mooi

:
MCP3008
Goed, eerst even terug naar het probleem. Ik had de vloersensoren als volgt verbonden:
3.3v ------------------ IR-LED +
GPIO ---------------- Phototransistor +
GND ----------------- IR LED - & Phototransistor -
Kort gezegd, Infrarood licht schijnt op de vloer en weerkaatst in de Phototransistor. Dat zorgt ervoor dat de weerstand lager wordt tussen de GPIO en ground. Op de Raspberry PI heb ik een interne pull-up weerstand geactiveerd, waardoor hij standaard een digitale waarde heeft van 1, tenzij hij omlaag getrokken wordt naar 0 door het IR licht. Dus, wel vloer: waarde = 0, geen vloer, waarde = 1...
Dat werktte bij mij op zolder prima, met een gladde laminaatvloer. Maar, toen ik beneden op mijn tegelvloer (Waar hij uiteindelijk ook zijn werk zal gaan doen) hem een rondje wilde laten maken om te testen, bleef hij heel braafjes binnen dezelfde tegel.
Wat bleek? De voeg tussen elke tegel zit wat dieper dan de tegel zelf waardoor de sensor te weinig IR licht meet en hij (onterecht!) aangeeft dat er geen vloer meer is.
De oplossing is iets minder simpel dan het probleem, om het op meerdere ondervloeren werkend te krijgen moet ik het signaal niet digitaal meten, maar analoog, zo kan ik precies meten hoeveel IR licht er terug komt en hoe ver de afstand van sensor tot vloer dus is.
Wat daarvoor nodig is is een ADC (Analog to digital converter). Nu had ik die al, maar die had 4 kanalen waarvan ik er al 2 in gebruik had voor de bumpersensoren en nog 2 nodig had om later het batterijniveau te meten. Dan kom ik er dus minstens 3 tekort.
Zodoende heb ik dus het volgende gekocht:

Dit is een MCP3008. Je gooit er 3.3v en ground in, en sluit hem aan via SPI en dan krijg je er 8 analoge kanalen voor terug die je uit kunt lezen. Bij elk kanaal komt er een getal tussen 0 en 1024 uit. 1024 is ongeveer 3.8v, 0 = 0v.
Even later zag het er zo uit:

De oplettende kijker ziet ook 3 weerstandjes boven de MCP zitten. Alle 3 de kanalen die ik gebruik voor de infraroodsensoren heb ik ook verbonden met een pull-up weerstand tussen de 3.3v en de kanalen. Dit omdat een MCP3008 geen interne weerstanden heeft. Doe je dat niet, dan blijft de waarde altijd rond de 0, of hij nu wel of geen vloer ziet
Dit werkt super. De waarden liggen normaliter rond de 400-700 en pas zodra ik de robotstofzuiger van de vloer optil komen de waarden rond de 1000 te liggen. Oftewel, ik controleer nu in de software een paar keer per seconde of de waarde > dan 975. Zo ja, dan stopt hij met rijden en gaat hij terug in tegengestelde richting.
Wat nu ook leuk is, is dat ik aardig goed kan meten of hij daadwerkelijk aan het rijden is of dat hij ergens vast is komen te zitten. Dat was namelijk een probleem. Mijn zitbank bijvoorbeeld, is hoger dan de voorbumper van de stofzuiger, maar net niet hoog genoeg dat hij eronderdoor kan rijden

. Oftewel, hij rijdt zichzelf vast onder de bank. De stofzuiger merkt dit niet en gaat vrolijk door met naar voren rijden, maar in de praktijk komt hij niet verder. Dat lijkt me niet heel goed voor de motoren die de wielen bedienen, en natuurlijk is het ook niet de bedoeling dat hij ergens vast komt te zitten
Dus, wat ik nu doe, is ik meet van alle drie de vloersensoren wat het verschil is tussen hun huidige waarde en hun vorige waarde. Hiervan houdt ik een historie bij van de afgelopen 10 waarden (om false-positives te voorkomen). Als hij rondrijdt dan wisselt de waarde van de 3 sensoren gecombineerd behoorlijk, zo'n 300-1000 is de waarde. Als hij vast komt te zitten en dus bijna niet meer beweegt, dan zakt de waarde in tot 0-20. Dat is dus een behoorlijk verschil wat goed te meten is.
Zodra het gemiddelde nu lager wordt dan 26, dan ga ik er vanuit dat hij zichzelf vastgereden heeft. Wat hij dan nu doet, is net zo lang in tegengestelde richting rijden totdat hij weer een waarde heeft die boven de 150 ligt, oftewel, totdat hij zeker weten niet meer vast zit.
Ik heb dit even getest, en dat werkt super. Hij komt vast te zitten en rijdt zichzelf dan weer braaf los!

Vervolg
We zijn er nog niet. ik heb nog een paar onderdelen onderweg die ik hopelijk binnenkort binnen krijg om weer een stap verder te komen. Eén daarvan is een accelerometer en een magnetometer. De accelerometer was in eerste instantie bedoeld om te meten of hij daadwerkelijk nog vooruit beweegt of ergens vast zit, maar zoals ik vertelde heb ik dat waarschijnlijk al op een andere manier opgelost

De Magnetometer is bedoeld om hem netjes in een rechte lijn te laten rijden. Momenteel buigt hij langzaam maar zeker wat af, soms naar links, soms naar rechts. De enige manier om dat een beetje op te lossen is met een magnetometer, die dan kan bijhouden of hij nog steeds in dezelfde richting rijdt, en hierin kan bijsturen. Tevens kan ik dan ook andere leuke dingen mee doen, zoals room-mapping in de toekomst.
Enige probleem, het hoofd PCB'tje wordt aardig vol ondertussen. De vraag is of het allemaal nog ergens gaat passen, maar we zullen het zien.
Tenslotte ben ik bezig met het vervangen van het relay board. Deze zit onder het hoofd-PCB wat je hierboven op de foto ziet. Ik ga deze vervangen met een bordje waar de netspanning (20v) binnen komt, en wat alle andere stroomzaken regelt. Bijvoorbeeld het omzetten naar 16.8v voor de batterij, het meten hoe hard de batterij oplaad of ontlaad en hoe vol de batterij is, en ook de stroomomzetting en schakeling doet voor de stofzuigmotor. Zie hieronder een foto van het originele bordje rechts, en de (nog op formaat te zagen) nieuwe bordje links:

Hierop missen nog veel onderdelen en is nog niks gesoldeerd, alleen al ongeveer op de juiste plek gezet, maar het zou zo moeten worden:
Binnenkort hierover dus meer, want, zodra ik hier alles van binnen heb en het kan solderen, is eigenlijk het project ook al weer bijna af!! Dan kan ik in één klap opladen en de stofzuiger gebruiken, oftewel dan zou hij al zijn werk kunnen doen
Wordt wederom vervolgd! Reacties, tips, vragen of opmerkingen zijn zoals altijd meer dan welkom!