Raspbian (pios) - bash - if then - problème de conditions multiples

Bonjour, j’ai dans mon code des conditions en cascade avec « if then », je ne sais pas si je dois utiliser « elif » ou si c’est un problème de syntaxe.

#!/bin/bash
clear
x=150
y=150
mouve="arrêt"
tourne="tout droit"

#robot à l'arrêt (pin12 bcm : 150), direction devant (pin 18 bcm: 150)
gpio -g mode 12 pwm;gpio pwm-ms;gpio pwmc 192;gpio pwmr 2000;gpio -g pwm 12 $x
gpio -g mode 18 pwm;gpio pwm-ms;gpio pwmc 192;gpio pwmr 2000;gpio -g pwm 18 $y

#lancement du streaming
tput cup 1 20;echo "... lancement du streaming ..."
tput cup 2 20;echo "lire avec : cvlc tcp/MJPEG://192.168.0.12:1234"
printf "$(raspivid -n -t 0 -w 640 -h 480 -vf -hf -cd MJPEG -l -o tcp://0.0.0.0:1234)" &
#lire coté client avec : "cvlc tcp/MJPEG://192.168.0.12:1234" (MJPEG en majuscule)
sleep 2

tput cup 3 20;printf "qqq ou Ctrl+c pour arréter"
tput cup 5 2;echo $mouve
tput cup 6 2;echo "position de la roue :" $tourne

while true
do
read -rsn3 -d '' TOUCHE
case ${TOUCHE:2} in
 A) TOUCHE="↑" ;;
 B) TOUCHE="↓" ;;
 C) TOUCHE="→" ;;
 D) TOUCHE="←" ;;
 q) TOUCHE="q" ;;
esac

if [ $TOUCHE = "↑" ];then
	if [ $y=50 ];then y=128;mouve=arrière lente;fi
	if [ $y=128 ];then y=150;mouve=arrêt;fi
	if [ $y=150 ];then y=170;mouve=avance lente;fi
	if [ $y=170 ];then y=240;mouve=avance rapide;fi
gpio -g mode 18 in;gpio -g mode 12 pwm;gpio pwm-ms;gpio pwmc 192;gpio pwmr 2000;gpio -g pwm 12 $y
fi

if [ $TOUCHE = "↓" ];then
	if [ $y=240 ];then y=170;mouve=avance lente;fi
	if [ $y=170 ];then y=150;mouve=arrêt;fi
	if [ $y=150 ];then y=128;mouve=arrière lente;fi
	if [ $y=128 ];then y=50;mouve=arrière rapide;fi
gpio -g mode 18 in;gpio -g mode 12 pwm;gpio pwm-ms;gpio pwmc 192;gpio pwmr 2000;gpio -g pwm 12 $y
fi

if [ $TOUCHE = "→" ];then
	if [ $x=52 ];then x=105;tourne=tout droit;fi
	if [ $x=105 ];then x=220;tourne=à droite;fi
gpio -g mode 12 in;gpio -g mode 18 pwm;gpio pwm-ms;gpio pwmc 192;gpio pwmr 2000;gpio -g pwm 18 $x
fi

if [ $TOUCHE = "←" ];then
	if [ x=220 ];then x=105;tourne=tout droit;fi
	if [ x=105 ];then x=52;tourne=à gauche;fi
gpio -g mode 12 in;gpio -g mode 18 pwm;gpio pwm-ms;gpio pwmc 192;gpio pwmr 2000;gpio -g pwm 18 $x
fi
if [ $TOUCHE = "q" ];then killall raspivid;gpio -g mode 12 in; gpio -g mode 18 in;exit
fi
clear
tput cup 3 20;printf "qqq ou Ctrl+c pour arréter"
tput cup 5 2;echo $mouve
tput cup 6 2;echo "position de la roue :" $tourne
#tput cup 8 5
#echo "La flèche est \"${TOUCHE}\""
done

hello,

peut être un truc comme ça:

if [ $TOUCHE = "↑" ];then
if [ $y -eq 50 ];then y=128;mouve="arrière lente";
elif [ $y -eq 128 ];then y=150;mouve="arrêt";
elif [ $y -eq 150 ];then y=170;mouve="avance lente";
elif [ $y -eq 170 ];then y=240;mouve="avance rapide";fi
echo $y $mouve
fi

j "avais pas de robot sous la main j ai mis un « echo » mais avec le gpio … ça doit le faire pareil :wink:

source : 7.3. Autres opérateurs de comparaison

Bonjour,

Je me suis permis de mettre en forme le script pour qu’il soit plus lisible en le selectionnant et en cliquant sur l’icone « </> ».
Merci de procéder à cette fonction à l’avenir.

EDIT: Bien lire la réponse de @bof. Chaque valeur de la variable mouve doit bine être entre guillemets !

A+

Voilà, ça fonctionne. Par contre j’ai pas bien compris pourquoi « -eq » alors que « = » ne fonctionne pas, la logique des langages…, presque pire que « brainfuck ».

Pour info pour celles et/ou ceux que ça intéressent, un robot et son programme :
Robot : PI zero WH + 1 servo à rotation continu + 1 servo 360 + module caméra + module d’alimentation lithium ion 18650 + 1 accus lithium ion 18650

module d’alimentation 5 volts : ICI ou LA

servo à rotation continu :
marron - GPIO pin 6 (GND)
rouge - GPIO pin 2 (+5 volt)
orange - GPIO pin 32 - BCM pin 12 (signal PWM)

servo 360 :
marron - GPIO pin 6 (GND)
rouge - GPIO pin 2 (+5 volt)
orange - GPIO pin 12 - BCM pin 18 (signal PWM)

module caméra : sur le port caméra
module d’alimentation : sur le port usb
batterie lithium 18650 : dans le module d’alimentation

Le PI zero sous raspbian lite est connecté à ma box en wifi et à l’adresse IP 192.168.0.12
Avec 1 PI 3B+ (raspbian full) dans la console :
pi@3bplus:~ $ ssh 192.168.0.12
pi@3bplus:~ $ mot de passe
pi@zero:~ $ cd tonio
pi@zero:~/tonio $ sudo chmod 777 robot
pi@zero:~/tonio $ ./robot

Pour lire le streaming j’utilise cvlc avec raspbian (PI 3B+) ou vlc avec windows (plus fluide)
cvlc tcp/MJPEG://192.168.0.12:1234
Pour windows j’ai eu des difficultés suivant la version de vlc.

Le programme n’est pas très optimisé, je l’appel « robot »


*** robot ***


#!/bin/bash
clear
x=150
y=150
mouve="arrêt"
tourne="tout droit"

#robot à l'arrêt (pin12 BCM : 150), direction devant (pin 18 BCM : 150)
gpio -g mode 12 pwm;gpio pwm-ms;gpio pwmc 192;gpio pwmr 2000;gpio -g pwm 12 $x
gpio -g mode 18 pwm;gpio pwm-ms;gpio pwmc 192;gpio pwmr 2000;gpio -g pwm 18 $y

#lancement du streaming
tput cup 1 20;echo "... lancement du streaming ..."
tput cup 2 20;echo "lire avec : cvlc tcp/MJPEG://192.168.0.12:1234"
printf "$(raspivid -n -t 0 -w 640 -h 480 -vf -hf -cd MJPEG -l -o tcp://0.0.0.0:1234)" &
#lire coté client avec : "cvlc tcp/MJPEG://192.168.0.12:1234" (MJPEG en majuscule)
sleep 2

tput cup 4 20;printf "qqq ou Ctrl+c pour arréter"
tput cup 5 2;echo $mouve
tput cup 6 2;echo "position de la roue :" $tourne

while true
do
read -rsn3 -d '' TOUCHE
case ${TOUCHE:2} in
 A) TOUCHE="↑" ;;
 B) TOUCHE="↓" ;;
 C) TOUCHE="→" ;;
 D) TOUCHE="←" ;;
 q) TOUCHE="q" ;;
esac

if [ $TOUCHE = "↑" ];then
	if [ $y -eq 50 ];then y=128;mouve="arrière lente";
	elif [ $y -eq 128 ];then y=150;mouve="arrêt";
	elif [ $y -eq 150 ];then y=170;mouve="avance lente";
	elif [ $y -eq 170 ];then y=240;mouve="avance rapide";fi
gpio -g mode 18 in;gpio -g mode 12 pwm;gpio pwm-ms;gpio pwmc 192;gpio pwmr 2000;gpio -g pwm 12 $y
fi

if [ $TOUCHE = "↓" ];then
	if [ $y -eq 240 ];then y=170;mouve="avance lente";
	elif [ $y -eq 170 ];then y=150;mouve="arrêt";
	elif [ $y -eq 150 ];then y=128;mouve="arrière lente";
	elif [ $y -eq 128 ];then y=50;mouve="arrière rapide";fi
gpio -g mode 18 in;gpio -g mode 12 pwm;gpio pwm-ms;gpio pwmc 192;gpio pwmr 2000;gpio -g pwm 12 $y
fi

if [ $TOUCHE = "→" ];then
	if [ $x -eq 52 ];then x=150;y=150;tourne="tout droit";mouve="arrêt";
	elif [ $x -eq 150 ];then x=220;y=150;tourne="à droite";mouve="arrêt";fi
gpio -g mode 12 in;gpio -g mode 18 pwm;gpio pwm-ms;gpio pwmc 192;gpio pwmr 2000;gpio -g pwm 18 $x
fi

if [ $TOUCHE = "←" ];then
	if [ $x -eq 220 ];then x=150;y=150;tourne="tout droit";mouve="arrêt";
	elif [ $x -eq 150 ];then x=52;y=150;tourne="à gauche";mouve="arrêt";fi
gpio -g mode 12 in;gpio -g mode 18 pwm;gpio pwm-ms;gpio pwmc 192;gpio pwmr 2000;gpio -g pwm 18 $x
fi

if [ $TOUCHE = "q" ];then killall raspivid;gpio -g mode 12 in; gpio -g mode 18 in;exit
fi

clear
tput cup 4 20;printf "qqq ou Ctrl+c pour arréter"
tput cup 5 2;echo $mouve
tput cup 6 2;echo "position de la roue :" $tourne

done

Les valeurs de x et y sont à caler.

Et merci celles et/ou ceux qui ont rendu cela possible.