Aller au contenu

Boucle Robot Raspberry & capteur infrarouge GPIO


Messages recommandés

Bonsoir,

Je suis tombé par hasard sur votre forum (ici plus précisément) de geek que j'adore, et j'ai eu envie de me lancer dans un défi un peu hard pour mes compétences dans le cadre de mes études. La réalisation robot Raspberry pi type R.Cerda et sur les différents tutos que j'ai trouver ici

Ayant de petites base en d'autre langage de programmation(Php, CSS, HTML, SQL, JAVA, ...) (pas du tout le python et un tout petit peu le C).

Bref là où je bloque c'est a la réalisation de la boucle, car je n'ai pas utilisé une Breadboard ni de multiples câbles, mais un circuit imprimé maison.

Les codes sources que j'essaie de modifier depuis maintenant deux jours sont https://github.com/sarinkhan/R.Cerda en python malheureusement, sur tous les scripts le seul que j'arrive à faire fonctionner est le testservosweep.py qui fais tourner mes moteurs à grande vitesse et qui ensuite s'enchaine pas une boucle infinie suivie du plantage de ma Pi. (Et oui je suis novice :) )

J'ai essayé de changer les numéros de Pins GPIOS, mais sans suces. J'essaye de faire fonctionner r1.py, mais j'ai des retours erreur à cause du capteur qui est manifestement différent il serait bon que j'arrive à adapter au capteur infrarouge, mais que faire.

Mon problème est de ne pas savoir quel Pin GPIOS je dois mettre dans le script étant donné que je n'ai pas la même configuration que vous sur mes branchements. Comme savoir quel Pin est relié à mes deux servomoteurs.

Au niveau du matériel :

- Deux DC moteurs

- Raspberry Pi modél B 512 Mb

- Carte SD avec RaspBian

- Deux puces L293D

- Une puce MCP23017

- Une puce MCP23008

- Le switch voltage

- En capteur infrarouge Sharp (le moins cher)

Aperçu

https://docs.google.com/file/d/0B7HB-H4HAKDZc1YwY0FPNW9jT1k/edit?usp=sharing

https://docs.google.com/file/d/0B7HB-H4HAKDZV0FYYzF6Wl9tckU/edit?usp=sharing

Peut être avez-vous des tutos complets sur le raccordement moteur/infrarouge, ou peut être que vous serez plus m'éclairer.

Le but étant d'avoir un robot capable de rouler si obstacle tourner droite ou gauche sinon continuer.

Ça parait simple, une boucle ... Mais je suis perdu, la notion électro/programmation me paume complètement.

Après avoir acheter du matériel et avoir envie de réussir cette petite prouesse, je viens vous demandez de l'aide, des conseils. Je suis totalement novice, et geek autodidacte.

D'avance, merci.

-Graincheux

Lien vers le commentaire
Partager sur d’autres sites

Slt Graincheux,



Peut être avez-vous des tutos complets sur le racordement moteurs/infrarouge, ou peut être que vous serez plus m'éclairer.

Je te signale la présence d'une centralisation Raspberry en section "Topic Perso", animée par un membre du forum :ouioui:

Elle est vraiment très fournie et active... Je pense que tu y trouveras pas mal d'information :yes:

:chinois:

EDIT: Oups, je vois que c'est par la centra que tu as découvert le forum :oops:

Je te propose de laisser @sky99 répondre précisément à ta question ici... Et de poursuivre après dans la centra, ok ? ;)

Lien vers le commentaire
Partager sur d’autres sites

Ouais ça me semble bien, j'ai déjà lu tout le topique sur le sujet, d'où mon topique à moi. Car je n'ai rien vu sur mon cas de figure. Si tu penses qu'l y ait plus de chance qu'il le voit dans une autre section ne te gêne pas. Je n'étais pas sur d’où le mettre.

Merci de ta réponse.

Lien vers le commentaire
Partager sur d’autres sites

Bonsoir, je reviens à vous pour vous dire que j'ai eu le temps d'avancer en 4 jours d'apprentissages sans relâche. J'ai réussi à adapter deux codes python (en C je n'obtiens absolument rien...) J'ai l'impression que mon code est bon pourtant j'ai une erreur :

Traceback (most recent call last):  File "robotStart.py", line 178, in <module>    moveForward(m1a,m1b,m1e,m2a,m2b,m2e)  File "robotStart.py", line 84, in moveForward    mcp.output(m1a, 1)

Mon code python : (basé sur R.Cerda)

#!/usr/bin/python# -*- coding: UTF-8 -*-from Adafruit_I2C import Adafruit_I2Cimport smbusimport timeimport osimport RPi.GPIO as GPIOfrom Adafruit_MCP230xx import Adafruit_MCP230XXimport smbusimport datetimeimport subprocess as subimport urllib2, urllibGPIO.setmode(GPIO.BCM)GPIO.setwarnings(False)#fonction lisant les donnees SPI de la puce MCP3008, parmi 8 entrees, de 0 a 7def readadc(adcnum, clockpin, mosipin, misopin, cspin):        if ((adcnum > 7) or (adcnum < 0)):                return -1        GPIO.output(cspin, True)        GPIO.output(clockpin, False)  # start clock low        GPIO.output(cspin, False)     # bring CS low        commandout = adcnum        commandout |= 0x18  # start bit + single-ended bit        commandout <<= 3    # we only need to send 5 bits here        for i in range(5):                if (commandout & 0x80):                        GPIO.output(mosipin, True)                else:                        GPIO.output(mosipin, False)                commandout <<= 1                GPIO.output(clockpin, True)                GPIO.output(clockpin, False)        adcout = 0        # read in one empty bit, one null bit and 10 ADC bits        for i in range(12):                GPIO.output(clockpin, True)                GPIO.output(clockpin, False)                adcout <<= 1                if (GPIO.input(misopin)):                        adcout |= 0x1        GPIO.output(cspin, True)        adcout /= 2       # first bit is 'null' so drop it        return adcout# ces numeros de pins GPIO doivent etre modifies pour correspondre aux broches utilisees.SPICLK = 18SPIMISO = 23SPIMOSI = 24SPICS = 25# definition de l'interface SPIGPIO.setup(SPIMOSI, GPIO.OUT)# definition de l'interface SPIGPIO.setup(SPIMOSI, GPIO.OUT)GPIO.setup(SPIMISO, GPIO.IN)GPIO.setup(SPICLK, GPIO.OUT)GPIO.setup(SPICS, GPIO.OUT)inch=3300.0/512.0#definition du ADC utilise (broche du MCP3008). Cette valeur peut aller de 0 à 7.adcnum = 0# Lecture de la valeur brute du capteurread_adc0 = readadc(adcnum, SPICLK, SPIMOSI, SPIMISO, SPICS)# conversion de la valeur brute lue en milivolts = ADC * ( 3300 / 1024 )millivolts = read_adc0 * ( 3300.0 / 1024.0)print "\tvaleur brute : %s" % read_adc0print "\ttension : %s millivolts" % millivoltsif __name__ == '__main__':    mcp = Adafruit_MCP230XX(busnum = 1, address = 0x20, num_gpios = 16)    def readDistanceInch(adcnum, SPICLK, SPIMOSI, SPIMISO, SPICS):      r = readadc (adcnum, SPICLK, SPIMOSI, SPIMISO, SPICS)      r = r * ( 3300.0 / 1024.0)      r=r/inch      return r    def moveForward(m1a,m1b,m1e,m2a,m2b,m2e):      mcp.output(m1a, 1)      mcp.output(m1b, 0)      mcp.output(m1e, 1)      mcp.output(m2a, 1)      mcp.output(m2b, 0)      mcp.output(m2e, 1)    def moveBackward(m1a,m1b,m1e,m2a,m2b,m2e):      mcp.output(m1a, 0)      mcp.output(m1b, 1)      mcp.output(m1e, 1)      mcp.output(m2a, 0)      mcp.output(m2b, 1)      mcp.output(m2e, 1)    def stopMotors(m1a,m1b,m1e,m2a,m2b,m2e):      mcp.output(m1e, 0)      mcp.output(m2e, 0)    def turnLeft(m1a,m1b,m1e,m2a,m2b,m2e):      mcp.output(m1a, 0)      mcp.output(m1b, 1)      mcp.output(m1e, 1)      mcp.output(m2a, 1)      mcp.output(m2b, 0)      mcp.output(m2e, 1)    mcp.output(m2e, 1)    def turnRight(m1a,m1b,m1e,m2a,m2b,m2e):      mcp.output(m1a, 1)      mcp.output(m1b, 0)      mcp.output(m1e, 1)      mcp.output(m2a, 0)      mcp.output(m2b, 1)      mcp.output(m2e, 1)        #gestion des detecteurs de contact avant gauche et droit #   FLContactPin=7 #   FRContactPin=6   # def readFLContact():               return not(mcp.input(FLContactPin) >>FLContactPin)   # def readFRContact():#               return not(mcp.input(FRContactPin) >>FRContactPin)        #definition des broches du moteur 1    m1a=8    m1b=9    m1e=12        #definition des broches du moteur 2    m2a=10    m2b=11    m2e=13        #On definit les broches A et B du moteur 1, ainsi que la broche d'activation en sortie    mcp.config(m1a, mcp.OUTPUT)    mcp.config(m1b, mcp.OUTPUT)    mcp.config(m1e, mcp.OUTPUT)        # On definit les broches A et B du moteur 2, ainsi que la broche d'activation en sortie    mcp.config(m2a, mcp.OUTPUT)    mcp.config(m2b, mcp.OUTPUT)    mcp.config(m2e, mcp.OUTPUT)        # les broches du detecteur de contact avant sont configurees en lecture#    mcp.pullup(FRContactPin, 1)#    mcp.pullup(FLContactPin, 1)    dir1=1;    #boucle principale et infinie du moteur    while (True):        #       if(readFLContact()==1):        #               moveBackward(m1a,m1b,m1e,m2a,m2b,m2e)        #               time.sleep(0.2)        #       else :                        #lecture de la distance de l'obstacle le plus proche                d=readDistanceInch(0, SPICLK, SPIMOSI, SPIMISO, SPICS)                        #en dessous de 8 pouces, le robot recule pendant au moins 0.2s                if(d<:                        moveBackward(m1a,m1b,m1e,m2a,m2b,m2e)                if(d<:                        moveBackward(m1a,m1b,m1e,m2a,m2b,m2e)                                #time.sleep(0.2)                        #entre 8 et 16 pouces, le robot tourne pendant au moins 0.2s                elif(d<16) :                        turnLeft(m1a,m1b,m1e,m2a,m2b,m2e)                        time.sleep(0.2)                        #le reste du temps le robot avance pendant 0.05s                else :                        moveForward(m1a,m1b,m1e,m2a,m2b,m2e)                time.sleep(0.05)#                       except KeyboardInterrupt:#               print ""#               print "stop robot"#               stopMotors(m1a,m1b,m1e,m2a,m2b,m2e)#               print "motors stop, exit."#               sys.exit(0)
Lien vers le commentaire
Partager sur d’autres sites

J'ai manifestement corriger l'erreur avec le fichier

#!/usr/bin/pythonfrom Adafruit_I2C import Adafruit_I2Cimport smbusimport timeMCP23017_IODIRA = 0x00MCP23017_IODIRB = 0x01MCP23017_GPIOA  = 0x12MCP23017_GPIOB  = 0x13MCP23017_GPPUA  = 0x0CMCP23017_GPPUB  = 0x0DMCP23017_OLATA  = 0x14MCP23017_OLATB  = 0x15MCP23008_GPIOA  = 0x09MCP23008_GPPUA  = 0x06MCP23008_OLATA  = 0x0Aclass Adafruit_MCP230XX(object):	OUTPUT = 0	INPUT = 1	def __init__(self, address, num_gpios, busnum = 0):		assert num_gpios >= 0 and num_gpios <= 16, "Number of GPIOs must be between 0 and 16"		self.i2c = Adafruit_I2C(address=address, bus=smbus.SMBus(busnum))			self.address = address		self.num_gpios = num_gpios		# set defaults		if num_gpios <= 8:			self.i2c.write8(MCP23017_IODIRA, 0xFF)  # all inputs on port A			self.direction = self.i2c.readU8(MCP23017_IODIRA)			self.i2c.write8(MCP23008_GPPUA, 0x00)		elif num_gpios > 8 and num_gpios <= 16:			self.i2c.write8(MCP23017_IODIRA, 0xFF)  # all inputs on port A			self.i2c.write8(MCP23017_IODIRB, 0xFF)  # all inputs on port B			self.direction = self.i2c.readU8(MCP23017_IODIRA)			self.direction |= self.i2c.readU8(MCP23017_IODIRB) << 8			self.i2c.write8(MCP23017_GPPUA, 0x00)			self.i2c.write8(MCP23017_GPPUB, 0x00)  	def _changebit(self, bitmap, bit, value):		assert value == 1 or value == 0, "Value is %s must be 1 or 0" % value		if value == 0:			return bitmap & ~(1 << bit)		elif value == 1:			return bitmap | (1 << bit)	def _readandchangepin(self, port, pin, value, currvalue = None):		assert pin >= 0 and pin < self.num_gpios, "Pin number %s is invalid, only 0-%s are valid" % (pin, self.num_gpios)		#assert self.direction & (1 << pin) == 0, "Pin %s not set to output" % pin		if not currvalue:			 currvalue = self.i2c.readU8(port)		newvalue = self._changebit(currvalue, pin, value)		self.i2c.write8(port, newvalue)		return newvalue	def pullup(self, pin, value):		if self.num_gpios <= 8:			return self._readandchangepin(MCP23008_GPPUA, pin, value)		if self.num_gpios <= 16:			if (pin < <img src='https://forum.nextinpact.com/public/style_emoticons/<#EMO_DIR#>/lunettes1.gif' class='bbc_emoticon' alt='8)' />/>/>/>/>:				return self._readandchangepin(MCP23017_GPPUA, pin, value)			else:				return self._readandchangepin(MCP23017_GPPUB, pin-8, value)	# Set pin to either input or output mode	def config(self, pin, mode):	  		if self.num_gpios <= 8:			self.direction = self._readandchangepin(MCP23017_IODIRA, pin, mode)		if self.num_gpios <= 16:			if (pin < <img src='https://forum.nextinpact.com/public/style_emoticons/<#EMO_DIR#>/lunettes1.gif' class='bbc_emoticon' alt='8)' />/>/>/>/>:				self.direction = self._readandchangepin(MCP23017_IODIRA, pin, mode)			else:				self.direction = self._readandchangepin(MCP23017_IODIRB, pin-8, mode)		return self.direction	def output(self, pin, value):		# assert self.direction & (1 << pin) == 0, "Pin %s not set to output" % pin		if self.num_gpios <= 8:			self.outputvalue = self._readandchangepin(MCP23008_GPIOA, pin, value, self.i2c.readU8(MCP23008_OLATA))		if self.num_gpios <= 16:			if (pin < <img src='https://forum.nextinpact.com/public/style_emoticons/<#EMO_DIR#>/lunettes1.gif' class='bbc_emoticon' alt='8)' />/>/>/>/>:				self.outputvalue = self._readandchangepin(MCP23017_GPIOA, pin, value, self.i2c.readU8(MCP23017_OLATA))			else:				self.outputvalue = self._readandchangepin(MCP23017_GPIOB, pin-8, value, self.i2c.readU8(MCP23017_OLATB))		return self.outputvalue		self.outputvalue = self._readandchangepin(MCP23017_IODIRA, pin, value, self.outputvalue)		return self.outputvalue	  	def input(self, pin):		assert pin >= 0 and pin < self.num_gpios, "Pin number %s is invalid, only 0-%s are valid" % (pin, self.num_gpios)		assert self.direction & (1 << pin) != 0, "Pin %s not set to input" % pin		if self.num_gpios <= 8:			value = self.i2c.readU8(MCP23008_GPIOA)		elif self.num_gpios > 8 and self.num_gpios <= 16:			value = self.i2c.readU16(MCP23017_GPIOA)			temp = value >> 8			value <<= 8			value |= temp		return value & (1 << pin)def readU8(self):  result = self.i2c.readU8(MCP23008_OLATA)  return(result)def readS8(self):  result = self.i2c.readU8(MCP23008_OLATA)  if (result > 127): result -= 256  return resultdef readU16(self):  assert self.num_gpios >= 16, "16bits required"  lo = self.i2c.readU8(MCP23017_OLATA)  hi = self.i2c.readU8(MCP23017_OLATB)  return((hi << <img src='https://forum.nextinpact.com/public/style_emoticons/<#EMO_DIR#>/lunettes1.gif' class='bbc_emoticon' alt='8)' />/>/>/>/> | lo)def readS16(self):  assert self.num_gpios >= 16, "16bits required"  lo = self.i2c.readU8(MCP23017_OLATA)  hi = self.i2c.readU8(MCP23017_OLATB)  if (hi > 127): hi -= 256  return((hi << <img src='https://forum.nextinpact.com/public/style_emoticons/<#EMO_DIR#>/lunettes1.gif' class='bbc_emoticon' alt='8)' />/>/>/>/> | lo)def write8(self, value):  self.i2c.write8(MCP23008_OLATA, value)def write16(self, value):  assert self.num_gpios >= 16, "16bits required"  self.i2c.write8(MCP23017_OLATA, value & 0xFF)  self.i2c.write8(MCP23017_OLATB, (value >> <img src='https://forum.nextinpact.com/public/style_emoticons/<#EMO_DIR#>/lunettes1.gif' class='bbc_emoticon' alt='8)' />/>/>/>/> & 0xFF)	  # RPi.GPIO compatible interface for MCP23017 and MCP23008class MCP230XX_GPIO(object):	OUT = 0	IN = 1	BCM = 0	BOARD = 0	def __init__(self, busnum, address, num_gpios):		self.chip = Adafruit_MCP230XX(busnum, address, num_gpios)	def setmode(self, mode):		# do nothing		pass	def setup(self, pin, mode):		self.chip.config(pin, mode)	def input(self, pin):		return self.chip.input(pin)	def output(self, pin, value):		self.chip.output(pin, value)	def pullup(self, pin, value):		self.chip.pullup(pin, value)

J'ai maintenant plus aucune erreur... Mon capteur infrarouge fonctionne mais malheureusement aucun de mes moteurs ne daigne s'allumer. (Je sais pourtant qu'il fonctionne étant donner que avec le fichier TestServosweep.py (qui n'est pas adapteur pour mes moteurs DC)) les fait tourner.

Des idées ?

Lien vers le commentaire
Partager sur d’autres sites

Salut !

J'avoue que je n'ai pas tout lu le code source, mais un test que tu pourrais faire consisterait à prendre ton script avec lequel tu constates un souci, à commenter ce qui concerne le capteur infrarouge, à débrancher le capteur et à voir si tes moteurs se mettent en marche (quitte à forcer la valeur de retour correspondant au capteur pour qu'ils soient dans la situation adéquate).

J'avais un souci avec un servo et le capteur à ultrason que j'utilise, et en débranchant le capteur, ça s'est mis à marcher : il s'agissait simplement d'une alimentation trop faiblarde dans mon montage "à l'arrache".

Si tu es sûr de ton montage et de la puissance à la disposition de tes moteurs, as-tu fait un print des valeurs retournées par le capteur ?

Lien vers le commentaire
Partager sur d’autres sites

Bonsoir,

merci de ta réponse.

Entre temps j'ai réussi à faire marcher ma condition pour le capteur. Mais quand mes moteurs tournent ils font figer ma Raspberry Pi, et font chauffer la puce MPC270017....

J'ai aussi noté la présence d'un mauvais faux contact avec mes circuits imprimer.

J'espère que c'est pour cela que mon script plante.

Enfin j'ai également pu voir que mes broche moteurs n'avais pas les bons numéros.

Je vous tiens au courant.

J'ai fais un script pour tester juste les moteurs (sans capteurs) même résultat. Si je fais un script avec capteurs + condition des moteurs mais sans leur variable alors ça fonctionne du tonerre sauf que mon robot n'avance pas :)

Un tout grand merci.

Lien vers le commentaire
Partager sur d’autres sites

Bonsoir!

Etant en Guadeloupe, mes horaires sont différents, donc je réponds tard :)

En premier lieu, le programe testServo ne sert pas à commander un moteur DC, mais un servomoteur.

La différence entre un moteur DC simple et un servomoteur est importante, car le moteur DC tourne si on lui envoie du courant entre ses deux pattes, alors que le servo

à 3 fils, dont deux qui servent à l'alimentation (+ et -), tandis que le troisième sert à le contrôler. Pour cela, on enverra des signaux de durées précises sur ce fil de commande pour

faire tourner le servomoteur jusqu'à un angle précis.

Pour revenir aux moteurs DC, si le courant passe dans un sens, le moteur tourne dans un sens, si on fait passer le courant en sens inverse, il tournera dans l'autre sens.

Jusque là, tout va bien. Maintenant, le moteur consomme beaucoup de courant, plus que ce que peut fournir un GPIO, ou les broches du MCP23017.

Il est donc nécessaire d'utiliser un motor driver, le L293D.

Du coup, le montage est le suivant : le raspberry pi est connecté au MCP23017 ou MCP23008 par les broches I²C. Le MCP23017/23008 est connecté au L293D par 5 ou 6 broches.

Enfin, des fils partent du L293D vers les moteurs. En aucun cas, les moteurs ne doivent être connectés directement sur le MCP23017/23008.

Si tout cela est bien conforme, alors il reste à voir si le câblage lui même est bon.

Pour connecter le MCP23017 au Pi, c'est très simple, il suffit de suivre le montage présenté ici :

https://forum.nextinpact.com/topic/165594-raspberry-pi-fabriquons-des-trucs/page-2#entry2749081

Maintenant, entre le MCP23017/23008, il suffit de choisir 5 ou 6 broches. Par exemple les GPA0 à GPA5.

Dans ce cas, il suffit de modifier le code pour que celui ci reflète les choix. L'important c'est de bien savoir

quelle broche correspond à quoi.

Par la suite, la connexion des moteurs est relativement simple, il suffit de suivre ce schéma :

https://forum.nextinpact.com/topic/165594-raspberry-pi-fabriquons-des-trucs/page__view__findpost__p__2748806

Il est important de savoir que le +VM ne devra PAS être connecté à un GPIO, mais à une source de courant

capable de fournir la puissance nécessaire aux moteurs.

Si le MCP23017 chauffe tout le temps, même sans charge, c'est qu'il y a un problème de branchement, j'ai

eu une fois un tel problème, et c’était la broche not-reset qui était à 0. Du coup la puce faisait reset en permanance

et chauffait.

SI la puce chauffe quand les moteurs tournent, c'est que ceux ci sont alimentés par la puce, et ceci ne devrait

pas être le cas!

Concernant le capteur de distance, quand tu dis qu'il fonctionne, tu arrive bien à lire les valeurs? (je n'ai pas encore

ce capteur spécifique, j'en ai commandé un du même type mais pas encore reçu)

Si c'est le cas, c'est déjà une bonne chose, il ne reste plus qu'à faire tourner les moteurs.

Si le pi finit par planter, c'est sans doute que quelque chose tire trop de courant. Donc je penche

pour les moteurs qui prennent leur courant sur une mauvaise source.

Idéalement si le robot est branché sur des piles, les moteurs devraient prendre le courant sur celles ci directement (donc

le Vmotor sera connecté sur le + des piles).

Un point important toutefois,

Ces moteurs sont des moteurs simples, sans boite de vitesse. Le problème est qu'ils tournent vite, mais ils sont facilement bloqués.

Autrement dit, il ne seront pas forcément capables de faire tourner les roues du robot! Dans tous les cas, si tu parviens à les contrôler

dans le vide, il suffira de les remplacer par des moteurs adaptés quand ils seront disponibles.

Désolé si je n'ai pas réellement répondu à ta question, mais il faut d'abord s'assurer de tout ça avant de s’inquiéter de la programmation!

D'autre part il faut que je comprenne bien ton montage pour pouvoir t'aider, on va donc progresser par étapes :)

Du coup peux tu m'expliquer plus précisément ton montage?

Lien vers le commentaire
Partager sur d’autres sites

Bonsoir,

Un tout grand merci pour toutes tes réponses !

Cela m'aide bien notament pour la source de courant qui est effectivement pris sur ma carte imprimer. Et du coup sur la chauffe des puces et du plantage de ma framboise.

Effectivement j'ai le problème avec mes moteurs... Ils tournent vite, mais bloque des qu'ils sont sur le sol...

Du coup il faut mieux que j'en rachète ?

Tu m'as bien aider. Je n'ai désormais plus de problème avec mes scripts, juste avec mes moteurs et mon alimentation.

J'espere pouvoir réglé a pour mardi.

Pardon de ne pas avoir répondu plus tot c'était me gros rush avec mes cours.

Merci

Bonne soirée.

Lien vers le commentaire
Partager sur d’autres sites

Bonsoir,

Un tout grand merci pour toutes tes réponses !

Cela m'aide bien notament pour la source de courant qui est effectivement pris sur ma carte imprimer. Et du coup sur la chauffe des puces et du plantage de ma framboise.

Effectivement j'ai le problème avec mes moteurs... Ils tournent vite, mais bloque des qu'ils sont sur le sol...

Du coup il faut mieux que j'en rachète ?

Tu m'as bien aider. Je n'ai désormais plus de problème avec mes scripts, juste avec mes moteurs et mon alimentation.

J'espere pouvoir réglé a pour mardi.

Pardon de ne pas avoir répondu plus tot c'était me gros rush avec mes cours.

Merci

Bonne soirée.

Le problème avec tes moteurs, c'est que ce sont des moteurs simples. En pratique, ils peuvent tourner très vite, aux alentours de 10 000 tours par minute, quand on ne leur applique pas de résistance.

En revanche, leur couple est très faible à cette vitesse.

C'est pour cette raison qu'on fabrique des moteurs ayant une boite de vitesse réductrice intégrée. Cela permet d'augmenter le couple du moteur. Avant de revenir là dessus, voyons un peu ce que signifie le couple du moteur.

Le couple d'un moteur

Le couple est une unité qui s'exprime en N.m, Newtons par mètre. En pratique, il est souvent donné en kg.cm ou oz.cm.

En gros ça correspond à la "force de rotation" du moteur, en fonction de la distance à l'axe. Pour faire simple, on pourra dire que si ton moteur à une force de 1kg.cm, ça voudra dire que si tu as une roue

de 1cm de rayon, le moteur sera capable de générer une poussée de 1kg sur ces roues à 1cm. Plus la distance à l'axe est grande, plus le couple disponible est réduit. Du coup, si tu as une roue de 2cm, la poussée disponible sera de 1kg/2=500g. Donc

avec une roue de 4cm, tu te retrouves avec une poussée de 250g par moteur, si on considère que la roue permet de transmettre l'intégralité de la puissance.

Si tu as deux roues motrices, avec un moteur par roue, ça te fait une poussée de 500g, avec des roues de 4cm de rayon.

Maintenant, si ton robot pèse X kg, ça ne veut pas dire qu'il faut une force équivalente pour le pousser, car son poids est soutenu par le sol, sur terrain plat. Il faut une force suffisante pour vaincre la force de frottement.

Mais pour ma part, je simplifie, en me disant que si mon robot pèse X kg, et que mes moteurs fournissent X kg de poussée avec la configuration de mes roues, alors ça va. Cela me permet de ne pas trop m'inquieter

d'autres paramètres, tels inefficacité des roues. J'ai lu quelque part "estimez le couple dont vous avez besoin, puis prenez des moteurs fournissant le double de ce que vous avez calculé". C'est un peu mon approche ici,

je prends large, car je ne sais pas trop bien estimer le couple nécessaire. Jusqu'ici ça marche, et mes robots ont TOUS de la puissance disponible, les moteurs ne sont pas "à fond", de sorte qu'ils peuvent pousser

des obstacles légers (je pense facilement au moins leur poids -en charge supplémentaire de leur poids déja-, avec un frottement normal).

Pour R Cerda, j'ai réussi à lui faire pousser une grosse boite de conserve.

Le rapport réducteur du moteur.

Maintenant revenons aux moteurs en eux même. Hormis certains moteurs spéciaux, la plupart des moteurs hobby tournent vite, avec un couple minuscule. Ils sont facilement bloqués.

Il existe des moteurs qui tournent vite, avec un gros couple, mais fatalement, ils consomment beaucoup plus. Par exemple, ma scie circulaire tourne a plusieurs milliers de tour par

minute, avec un couple suffisant pour couper 10cm de bois, mais consomme 600W.

La solution, c'est de mettre des engrenages qui vont permettre de faire tourner notre axe de sortie moins vite que le moteur lui même. Un peu comme sur le vélo, ou selon le pignon enclenché,

il devient plus ou moins facile de pédaler.

Ici, si on a un moteur qui fournit 1g.cm de couple, et tourne a 10 000 tours minute, on peut mettre un système d'engrenage tel que quand le moteur fait deux tours, l'axe de sortie fait un tour.

L'axe de sortie tournera a 5000 tours minute, et le couple disponible sera doublé, à 2g.cm. Donc avec le même moteur, avoir un rapport réducteur important augmentera d'autant le couple.

Mes moteurs sont soit des 180:1 ou des 120:1. Cela leur permet d'avoir respectivement 30 oz.in et 20 oz.in de couple, soit dans de vraies unités ( :p ) 2.16kg.cm et 1.44kg.cm de couple,

pour des vitesses de rotation de l'axe de 80 et 120 tours par minute.

La vitesse de rotation de l'axe conditionnera la vitesse du robot, plus l'axe final tournera vite, plus le robot pourra aller vite pour une taille de roues donnée.

Dans le même temps plus l'axe tournera vite pour un moteur donné, plus le couple sera faible. Il convient donc d'équilibrer le couple et la vitesse souhaitée, pour que le robot puisse bouger,

mais également qu'il puisse surmonter des obstacles plus ou moins forts.

Lien vers le commentaire
Partager sur d’autres sites

Dites les amis, comme annoncé dans le 2ème post du topic, le deal était de répondre précisément à la question concernant le petit problème de code de notre ami @Graincheux... Puis de revenir à la centra... (capitalisation, visibilité pour les autres, etc)

Je pense que l'objectif est atteint... OK pour fermer ce topic et repasser dans la centra ? ;)

:chinois:

Lien vers le commentaire
Partager sur d’autres sites

Dites les amis, comme annoncé dans le 2ème post du topic, le deal était de répondre précisément à la question concernant le petit problème de code de notre ami @Graincheux... Puis de revenir à la centra... (capitalisation, visibilité pour les autres, etc)

Je pense que l'objectif est atteint... OK pour fermer ce topic et repasser dans la centra ? ;)

:chinois:

Effectivement, je m'étale sans regarder la section :transpi::face:

Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines après...

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...