Pour les chers lecteurs de GeekTimes, le prochain (quatrième) article
tant attendu sur ce qui se passera si vous mélangez à nouveau l'arduino, ESP8266, WI-FI, assaisonnez-le avec un smartphone Android et saupoudrez-le au-dessus de l'application JAVA.
Nous parlerons des robots de l'
article avant-dernier, qui est venu le temps au moins de devenir un peu plus intelligent.

Peu importe, bienvenue au chat.
Si vous n'êtes pas très intéressé par la lecture d'anciens articles, alors brièvement - le fait était que pour contrôler le chariot à quatre roues habituel sur la plate-forme Arduino, un pont UART sans fil développé par moi basé sur le module ESP8266 bien connu y a été ajouté. Aussi pour plus de commodité (et en général c'était l'objectif principal) en utilisant le même ESP, j'ai écrit un programmeur pour arduinki, qui vous permet de le flasher à distance vous-même.

Autrement dit, le chariot quelque part loin (mais au sein de votre réseau WI-FI) voyage (oui, j'aime écrire ce mot), envoie des données et reçoit des commandes, et si nécessaire, par commande, il peut également changer le programme dans son microcontrôleur AVR. En conséquence, le programme sur JAVA pour PC a été lancé, un fonctionnement dont vous pouvez profiter du contrôle et obtenir une télémétrie primitive sous la forme de la distance parcourue (interrupteur à lames et aimant sur la roue).

De plus, j'ai expérimenté avec succès dans l'
article suivant le contrôle du chariot à l'aide d'un smartphone - boutons, inclinaisons et même voix. Mais lorsque le chariot est parti pour la pièce voisine, même la voix n'a pas pu le retourner (contrairement au chat). Elle y est allée, a frappé aux murs et aux meubles, s'est emmêlée dans des fils, mais en plus des informations sur la distance parcourue, elle n'a rien envoyé.
Par conséquent, l'idée a surgi immédiatement de fournir au futur Terminator des organes sensoriels. L'une des options les plus simples pour cela est l'utilisation du sonar.

L'algorithme de travail à la disgrâce est simple, on démarre le capteur d'un front et en même temps un compteur de microcontrôleur. HC-SR04 commence à projeter des ultrasons au loin. Le signal de réponse du capteur via un autre fil signale la fin de la mesure de distance et l'intervalle de temps entre le début et la réponse est proportionnel à la distance mesurée. En conséquence, en ce moment, nous ralentissons le compteur et voyons combien il en est entré.
La précision est obtenue jusqu'à environ un centimètre et une plage de mètres à deux. Il n'aime pas les surfaces laineuses et laineuses (par exemple, un chat), où tout écho signale une noyade irrévocable.
La zone affectée l' angle de vision du HC-SR04 est petite, donc afin de savoir ce qui se passe à l'avance dans le cadre d'un angle d'au moins 90 degrés, il est souhaitable de faire ce qui suit:
- visser le capteur à la servo-machine et le regarder dans différentes directions
- mettre quelques capteurs.
Au début, j'ai mis en œuvre la première option, mettant le sonar sur un servo SG90 bon marché et le chariot transformé en rover. Il a fallu tellement de temps pour prendre au moins trois mesures, donc, fondamentalement, le chariot s'est tenu en rotation avec un servo, puis a soigneusement avancé, mais pas très loin (et tout à coup, un obstacle est apparu sur le côté), et a de nouveau senti l'espace devant lui. Pourtant, le son n'est pas la lumière pour vous.
Par conséquent, sans plus tarder, j'ai mis trois systèmes de sonar à la fois. Le chariot a acquis une apparence d'araignée chthonic, s'est arrêté terne devant les obstacles et a commencé à les rouler en route. Mais au final, le cerveau était juste suffisant pour ne pas rester coincé dans un environnement amical. Nous devions passer à l'autonomie et au progrès. Et ici, sans sens différents, même le ver nématode vous le dira, vous ne pouvez pas le faire.
De plus, les amateurs commencent généralement à sculpter sur leurs créations divers nouveaux capteurs, tels que des gyroscopes, des accéléromètres, des magnétomètres et même des capteurs FIRE (tout ce que les Chinois sans nom produisent en millions de quantités pour Arduino). Et moi aussi, j'ai presque commencé sur cette voie glissante, mais j'ai changé d'avis à temps. Et je l'ai fait pour cette raison. Dans la perspective la plus éloignée, le robot robot était censé avoir une vision sous la forme d'une caméra et également comprendre ce qu'il voit. Mais le microcontrôleur AVR de la carte Arduino vous dira «au revoir» au stade de la réception de la vidéo, sans parler de son traitement. Et soudain, mon regard est tombé sur le vieux smartphone GALAXY S7, déjà battu par la vie.
Une telle puissance de calcul, huit cœurs, 4 gigaoctets de mémoire, deux caméras, l'accès au réseau, quoi d'autre est nécessaire pour transformer un singe en une personne?
Mais nous avons juste besoin d'un petit design pour que notre smartphone repose sur un chariot et qu'il puisse facilement être mis et retiré.

Ensuite, je suis monté sur le site des développeurs Android pour découvrir quelles autres fonctionnalités un smartphone classique peut nous offrir. Il s'est avéré que ce n'était pas petit. En théorie, vous pouvez
accéder aux capteurs capteurs suivants.TYPE_ACCELEROMETER
TYPE_AMBIENT_TEMPERATURE
TYPE_GAME_ROTATION_VECTOR
GEOMAGNETIC_ROTATION_VECTOR
TYPE_GRAVITY
TYPE_GYROSCOPE
TYPE_GYROSCOPE_UNCALIBRATED
TYPE_HEART_BEAT
TYPE_HEART_RATE
TYPE_LIGHT
TYPE_LINEAR_ACCELERATION
TYPE_LOW_LATENCY_OFFBODY_DETECT
TYPE_MAGNETIC_FIELD
TYPE_MAGNETIC_FIELD_UNCALIBRATED
TYPE_MOTION_DETECT
TYPE_ORIENTATION
TYPE_POSE_6DOF
TYPE_PRESSURE
TYPE_PROXIMITY
TYPE_RELATIVE_HUMIDITY
TYPE_ROTATION_VECTOR
TYPE_SIGNIFICANT_MOTION
TYPE_STATIONARY_DETECT
TYPE_STEP_COUNTER
TYPE_STEP_DETECTOR
Comme on dit, qu'est-ce qu'il y a seulement! Et en effet, il n'y avait pas grand-chose de spécifique au GALAXY S7. Par exemple, un capteur d'humidité. Et la température ambiante (même si j'ai bien compris qu'étant à l'intérieur du boîtier, elle affichera la température du smartphone lui-même). Mais les capteurs de pression et de lumière étaient présents. Sans oublier les gyroscopes, accéléromètres, à l'aide desquels, vous pouvez facilement déterminer votre position dans l'espace.
En conséquence, une décision a mûri, laissez le smartphone recevoir et traiter toutes les informations du plus haut niveau - la vidéo et tous ces différents capteurs. Et la plate-forme Arduino sera responsable, pour ainsi dire, de l'inconscient - de tout ce qui fonctionne déjà et ne nécessite pas de retouches, tous ces moteurs, sonars, interrupteurs à lames et ainsi de suite.
Comme il est difficile de déboguer le programme directement sur le smartphone, même avec UDB, j'ai décidé de laisser le tout être transféré sur un ordinateur personnel normal et y être traité. Et puis d'une manière ou d'une autre, quand il y aura une version fonctionnelle, nous retournerons le cerveau dans le panier. Nous devons commencer petit, et en effet, il est intéressant de regarder la transmission de vidéo à partir d'un chariot frénétique.
Les données des capteurs peuvent être envoyées sur une simple ligne, via un serveur client primitif, cela ne pose aucun problème. Mais avec le transfert de la vidéo, il y a eu immédiatement des difficultés. En général, j'avais besoin d'une diffusion en continu en temps réel depuis la caméra du smartphone vers la fenêtre d'application sur l'ordinateur. C'est pour l'instant. À l'avenir, non seulement moi, mais une sorte de système de reconnaissance de formes pourrait regarder cette image dans la fenêtre. Par exemple JAVA OpenCV. Ou peut-être même un réseau neuronal du cloud: D. Je ne sais pas, cette étape est encore très loin. Mais j'aimerais voir le monde avec «l'œil» d'un camion robotisé.
Tout le monde connaît de nombreuses applications telles qu'une "caméra mobile" de la boutique Google, où vous capturez un flux vidéo à partir de la caméra d'un smartphone en ouvrant un navigateur avec l'adresse IP souhaitée sur l'ordinateur. Par conséquent, au début, je pensais qu'il ne serait pas difficile de traduire moi-même depuis mon GALAXY (ce qui n'était pas une faible erreur), alors vous devez d'abord vérifier comment cela se passera avec sa réception sur l'ordinateur, étant donné que je ne peux écrire en quelque sorte que sur JAVA.
Il s'est avéré, avec la lecture vidéo JAVA, pour le dire légèrement, pas très bien. Il était une fois en 1997, le soi-disant Java Media Framework a été publié - une bibliothèque qui facilite le développement de programmes qui fonctionnent avec l'audio et la vidéo des créateurs de JAVA eux-mêmes. Mais quelque part après 2003, un gros boulon a été mis dessus et depuis, cela fait déjà 15 ans. Après quelques expériences, j'ai réussi à exécuter un fichier dans la fenêtre, je ne me souviens pas déjà lequel (il semble AVI), mais cette vue semblait assez misérable. Les fichiers avec d'autres extensions ne voulaient pas du tout s'exécuter, dans les cas extrêmes, il y avait une piste audio.
Sur Internet, j'ai trouvé deux autres projets alternatifs pour travailler avec la vidéo: Xuggler et aprica VLCj. Le premier projet était attrayant dans ses capacités, mais est également décédé il y a longtemps, mais le second s'est avéré assez vivant et intéressant dans son idée même. Les gars ont pris et attaché à JAVA le célèbre lecteur multimédia VLC. Autrement dit, aprica n'utilise pas de codecs auto-écrits, mais utilise des codecs prêts à l'emploi. Avec lui, vous perdrez tout fichier. Une sage décision, mais l'essentiel est que ce lecteur VLC soit déjà installé sur votre ordinateur. Eh bien, qui ne l'a pas? La seule mise en garde, cependant, est que vous avez les mêmes profondeurs de bits que le lecteur et JAVA. Par exemple, j'ai plus tard, avec surprise, découvert que j'avais encore un VLC 32 bits sur mon ordinateur, contrairement à JAVA 64 bits. Et une demi-journée de vie a été perdue en vain.
Les développeurs de Caprica promettent aux utilisateurs beaucoup de choses sur leur site Web. Et tous les formats de fichiers et lancement dans plusieurs fenêtres dans une application JAVA, lecture de vidéo à partir de You-Tube, capture d'un flux vidéo "en direct" et ainsi de suite. Mais la dure réalité a tout remis à sa place. Non, ils n'ont pas trompé avec des fichiers - tout est joué. Mais maintenant, la vidéo de YouTube ne veut plus. Au début, je ne comprenais pas pourquoi, mais j'ai ensuite vu une inscription dans le journal qui, quelque part, quelque part, il était impossible d'exécuter un certain script lua et j'ai immédiatement rappelé que:
Ce `` grattage d'écran '' de la page Web YouTube est fragile - si YouTube change la structure de leurs pages Web, alors VLC ne parviendra pas parfois à trouver l'URL de diffusion, lorsque cela se produit, vous devez attendre qu'un développeur fournisse une nouvelle LUA script et attendez la sortie d'une nouvelle version de VLC.
En bref, apparemment YouTube a changé la structure de sa page Web et je dois attendre une nouvelle version. D'un autre côté, j'ai besoin d'une diffusion vidéo «en direct» et de ne pas lire de fichier depuis le site. Autrement dit, même si le script lua fonctionnait, cela ne m'aiderait pas beaucoup.
Mais je n'ai pas du tout trouvé le streaming promis, bien qu'il soit écrit que:
Serveur de streaming réseau (par exemple une station de radio réseau ou un serveur de vidéo à la demande);
Client de streaming réseau;
Peut-être que c'est la liste de souhaits, ou peut-être que c'est dans la version commerciale, c'est difficile à dire.
Mais les fichiers sont lus, je le répète, sans aucune plainte. Par exemple, vous pouvez créer, voici une telle indécence
L'installation du package lui-même n'est pas difficile et est même décrite en détail, par exemple
ici . Certes, j'ai en quelque sorte maladroitement prescrit des variables d'environnement et maintenant mon VLC démarre pour la première fois avec un retard de dix secondes, mais il enregistre ensuite ce qui est nécessaire dans le cache et plus tard dans la session en cours démarre sans pause.
Ensuite, dans votre projet JAVA, vous prescrivez les dépendances nécessaires et vous pouvez commencer à
riveter les lecteurs multimédias dans les fenêtres JAVA pour qu'ils fonctionnent.
Ayant ainsi marqué le plan de travail approximatif du côté de l'ordinateur personnel, je suis retourné à la source des données vidéo, mon smartphone ANDROID.
Mais ici, je m'attendais à une autre déception assez importante. Après avoir scanné pas mal de sites et même le manuel ANDROID en ligne, j'ai trouvé qu'il était impossible d'organiser le streaming en temps réel en utilisant des moyens réguliers. Comme dans Caprica, vous ne pouvez lire que les fichiers déjà enregistrés. Autrement dit, l'appareil photo allumé, MEDIA RECORDER a commencé à enregistrer lorsqu'il devait être arrêté. Et nous ne pouvons accéder aux données (et à leur transfert) qu'après un arrêt.
J'ai trouvé la confirmation de mes conclusions dans un
article ancien. Il y avait vraiment des indices qu'une fois que quelqu'un a réussi à inciter Android à penser qu'il écrivait dans un fichier, mais en fait, il a glissé un tampon. Mais en tout cas, comme cela a déjà été expliqué précédemment, je n'ai pas pu capturer un tel flux vidéo côté PC dans l'application JAVA.
Par conséquent, une décision simple et
temporaire (je tiens à le souligner) a été prise: envoyer un flux vidéo de la caméra en morceaux pendant deux secondes. Pas un rover, bien sûr, mais le rover se révèle déjà assez.
Une fois cette décision prise, j'ai commencé à maîtriser les cours CAMERA et MEDIA RECORDER. Il existe de nombreux exemples de code sur le réseau pour lancer la caméra et enregistrer des fichiers vidéo, mais pour une raison quelconque, aucun d'entre eux n'a fonctionné pour moi. Ni sur l'émulateur, ni sur un vrai appareil. Il s'est avéré que la raison réside dans les autorisations, c'est-à-dire dans les autorisations. Il s'avère que des exemples de code ont été écrits à l'époque où Android était encore gratuit et que le programmeur pouvait faire ce qu'il voulait s'il écrivait toutes les autorisations nécessaires dans le manifeste. Mais ma version actuelle d'OC ne le permettait pas. Tout d'abord, vous deviez donner à l'utilisateur la permission d'écrire le fichier et d'allumer l'appareil photo immédiatement après le démarrage de l'application. Cela m'a coûté une activité supplémentaire, c'est-à-dire dans l'activité.
Classe MainActivity.javaimport android.Manifest; import android.content.Intent; import android.content.pm.PackageManager; import android.hardware.Camera; import android.media.MediaRecorder; import android.os.AsyncTask; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.Toast; import java.io.File; public class MainActivity extends AppCompatActivity { Camera camera; MediaRecorder mediaRecorder; public static MainActivity m; public static boolean Camera_granted; File videoFile; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if ((ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) ||(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) )
Après cela, les choses se sont bien passées et le code de travail suivant est apparu. La deuxième activité de la classe Camera_Activity est chargée de travailler avec la caméra et d'enregistrer des fichiers vidéo. Classe Http_server pour le transfert (le nom, bien sûr, est incorrect, mais il s'est avéré historiquement). Le code est simple, partout où il y a une explication.

Tout repose complètement sur le Github.
LienCamera_Activity import android.hardware.Camera; import android.media.MediaRecorder; import android.os.AsyncTask; import android.os.Bundle; import android.os.Environment; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.widget.Button; import android.widget.TextView; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.net.ServerSocket; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.content.Context; import android.hardware.Sensor; import static android.hardware.Camera.getNumberOfCameras; import java.io.BufferedOutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket; public class CameraActivity extends AppCompatActivity implements SensorEventListener { SurfaceView surfaceView; TextView mTextView; Button mStart; Button mStop; Camera camera; MediaRecorder mediaRecorder; public static ServerSocket ss; public static ServerSocket ss2; public static MainActivity m; public static volatile boolean stopCamera=true; public static int count=1; public static File videoFile1; public static File videoFile2; public static File videoFile3; public static volatile byte[] data; public SensorManager mSensorManager; public Sensor mAxeleration, mLight,mRotation,mHumidity,mPressure,mTemperature; public int ax; public int ay; public int az; public double light; public int x; public int y; public int z; public double hum; public double press; public double tempr; public static String Sensors; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
L'essence du programme après le démarrage et la mise sous tension de l'appareil photo est la suivante:
écrire une vidéo pendant deux secondes dans le premier fichier,
nous écrivons la vidéo pendant deux secondes dans le deuxième fichier, et en attendant, nous envoyons le premier fichier via TCP-IP via le WI-FI local à l'ordinateur,
réécrire le premier fichier, et en attendant envoyer le second,
et ainsi de suite.
Ensuite, le cycle se répète jusqu'à ce que le bouton «stop» soit enfoncé ou que la batterie du smartphone s'éteigne. En principe, il est possible de mettre en œuvre un analogue d'appuyer sur des boutons, en utilisant des commandes d'un ordinateur, également via TCP, ce n'est pas difficile.
Au début, le tampon vidéo, juste au cas où, se composait de trois fichiers au format 3GP (nous écrivons le premier, envoyons le troisième, nous écrivons le second, nous envoyons le premier, nous écrivons le troisième, nous envoyons le second), mais ensuite il s'est avéré que les deux fichiers sont assez suffisants (enregistrement et envoi mutuel) n'interfèrent pas).
Avec une résolution de caméra de 640 par 480, les fichiers sont obtenus, quelque part autour de 200-300 ko, ce qui est assez difficile pour mon routeur. Je ne me suis pas encore soucié du son, mais tout semble simple: vous installez les encodeurs audio nécessaires, les débits binaires, le nombre de canaux et autres.
Un peu plus tard, lorsque j'ai débogué le transfert de vidéo, j'ai complété le code également en transmettant des informations depuis les capteurs du smartphone. Tout est transmis trivialement sur une seule ligne, mais je ne pouvais pas le transférer via la même prise que la vidéo. Apparemment, les classes pour la transmission d'une chaîne PrintWriter et la transmission de données binaires BufferedOutputStream utilisent des flux différents, mais elles ont ensuite un tampon de sortie, où elles se complètent avec succès. En conséquence, la vidéo commence à se briser et à s'effondrer. De plus, le fichier vidéo est transmis toutes les deux secondes, et pour les capteurs, cet intervalle est trop long. Par conséquent, il a été décidé de les distribuer dans différentes prises afin qu'elles n'interfèrent pas entre elles. Pour cette raison, une nouvelle classe Http_server_Sensors est apparue.
Donc, nous avons organisé l'envoi, nous allons à nouveau retourner du côté de la réception sombre.
Comme nous l'avons déjà vu dans le tout premier exemple, la lecture de fichiers vidéo dans une application JAVA à l'aide d'un lecteur VLC ne pose désormais aucun problème. L'essentiel est d'obtenir ces fichiers.
Le programme de démonstration suivant en est responsable.
Lecteur vidéo import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.SwingUtilities; import uk.co.caprica.vlcj.component.EmbeddedMediaPlayerComponent; import uk.co.caprica.vlcj.discovery.NativeDiscovery; import uk.co.caprica.vlcj.player.MediaPlayer; import uk.co.caprica.vlcj.player.MediaPlayerEventAdapter; import java.io.*; import java.net.Socket; public class VideoPlayer { public final JFrame frame; public static EmbeddedMediaPlayerComponent mediaPlayerComponent; public final JButton pauseButton; public final JButton rewindButton; public final JButton skipButton; public static String mr1, mr2; public static boolean playing_finished = false; public static boolean File_1_play_starting = false; public static boolean File_1_play_finished = false; public static boolean File_2_play_starting = false; public static boolean File_2_play_finished = false;
Son essence est simple. Un client TCP est lancé, qui commence à attendre que le serveur soit prêt sur le smartphone. Ayant reçu le premier fichier, il démarre immédiatement et le fichier numéro deux est attendu en parallèle. De plus, il est prévu soit la fin de la réception du deuxième fichier, soit la fin de la lecture du premier. Le meilleur de tous, bien sûr,
trois étoiles , lorsque le fichier se télécharge plus rapidement qu'il ne joue. Si vous avez perdu le premier fichier, mais que vous n'avez pas encore reçu le second, alors tout est en attente ... Nous allons vous montrer un écran noir. Sinon, lancez rapidement la lecture du deuxième fichier et téléchargez à nouveau le premier simultanément.
J'avais un vague espoir que la pause entre les changements de lecture de fichiers serait inférieure au temps de réaction de l'œil humain, mais cela ne s'est pas concrétisé. Bien sûr, bien sûr, ce VLC.
En conséquence, nous obtenons une sorte de vile vidéo discontinue (le premier trilobite, apparemment, a vu le monde comme ça), où la netteté est toujours constamment ajustée. Et nous devons tenir compte du fait que la vidéo est également en retard de deux secondes. En bref, en production, je ne recommande pas de le diffuser. Mais j'ai un manque de poisson et de trilobite, comme on dit ...
En résumant ce qui précède, nous pouvons absolument dire que:
L'envoi de vidéo en morceaux est essentiellement inopérant et ne peut être utile que dans les cas où la vidéo est suffisamment longue et où vous n'avez pas besoin d'une seconde réaction à ce qui se passe.
La transmission vidéo sur TCP-IP est également une idée incorrecte, quoi que certaines personnalités de Habr disent à propos de la vitesse de transfert de données en utilisant ce protocole (qui est censé être encore plus rapide que UDP). Bien sûr, les intranets sans fil modernes ont de bonnes caractéristiques pour fournir des poignées de main continues aux serveurs et clients TCP, et TCP lui-même semble avoir été mis à niveau pour de longues données, mais les bouchons entre la lecture des focus vidéo, comme vous pouvez le voir sur la démo, apparaissent périodiquement.
Mais, au moins pour l'avenir, les pensées suivantes sont apparues:
- envoyer image par image (pas de vidéo, mais des photos) via UDP, mais contrôler les informations via TCP,
- pilotez des cadres photo tout au long d'UDP mais avec des signaux de synchronisation dans le même canal.
Bien sûr, jusqu'à présent, il y a plus de questions que de réponses. Y a-t-il assez de vitesse de réception chez JAVA avec son niveau d'abstraction pour travailler avec le réseau et les images? Est-il possible de faire 30 clichés normaux par seconde au niveau qui m'est accessible sous Android? Dois-je les récolter avant l'envoi afin de réduire le débit? Et puis JAVA est-il suffisant pour l'emballage et le déballage? Et si, tout à coup, quelque chose fonctionne, sera-t-il possible de passer à l'étape suivante, de visser le système de vision par ordinateur JAVA OpenCV ici? Lui-même, bien sûr, c'est toujours intéressant de regarder des vidéos en streaming depuis le niveau du sol, mais il ne faut pas oublier l'objectif le plus élevé - un robot robot avec l'intelligence d'une fourmi!
Mais, tout en ayant ce que nous avons, nous reviendrons au panier actuel. L'ancien programme de l'article avant-dernier pour le microcontrôleur AVR sur la plate-forme Arduino n'a pas beaucoup changé, seul le choix de la branche a été ajouté - conduite autonome ou contrôlée par l'opérateur. Les données que le chariot (moelle épinière) transmet via WIFI sont les mêmes - la distance parcourue. Un peu plus tard, j'ai également attaché le transfert de température d'un élément critique - le pilote de moteur. Tout cela est transmis et reçu d'abord par UART, et déjà lors de l'entrée dans le réseau via UDP. Je ne donne pas le code, toute l'analyse complète de l'
article avant-dernier
.
Pour deux moteurs, il (conducteur) est encore plus ou moins suffisant, mais avec quatre après un certain temps, il surchauffe à un état inopérant. Au début, j'ai essayé d'utiliser les capteurs de température analogiques les plus simples basés sur des diodes zener, tels que le LM335, mais rien n'en est sorti. Je n'avais pas de source de tension de référence, pour faire court, ION.
Et attraper des millivolts sur une batterie faible n'a pas de sens. Soit dit en passant, à propos de la batterie - quand j'étais fatigué de constamment retirer et réinsérer 14500 batteries au lithium afin de recharger, je viens de prendre une batterie de rechange à partir d'un tournevis et le chariot a commencé à rouler en continu pendant une heure et demie, en plus il a un aspect et un poids menaçants (oui, c'est sur cette batterie "Yeux"). Par conséquent, pour mesurer la température, j'ai installé un gyroscope-accéléromètre défectueux basé sur le L3G4200D. Heureusement, il a également mesuré la température et l'a transmise via le bus I2C.Un smartphone assis derrière la batterie et au-dessus des yeux de l'échosondeur transmet un flux vidéo, des lectures d'accéléromètre (vous pouvez l'utiliser pour incliner le chariot et le tangage du chariot lorsqu'il est debout), rouler et tanguer en degrés dans une dynamique déjà calculée par le smartphone lui-même (une option très pratique) , accélération linéaire dans le sens de la marche, éclairage. En général, bien sûr, vous pouvez transférer tout ce que votre smartphone peut mesurer, de la pression de l'air vers le nord.En conséquence, l'application sur JAVA a acquis la forme suivante:
Ce qui est drôle, c'est qu'il ressemble vraiment à un panneau de commande d'un rover lunaire soviétique, seulement j'ai un écran de télévision sur le côté, et ils l'ont au centre.
Lorsque vous l'allumez, connectez-vous d'abord au chariot et au smartphone, sélectionnez le mode de contrôle manuel ou l'autonomie complète - et c'est parti! Jusqu'à ce que la fenêtre de température du conducteur devienne jaune puis devient rouge. Graphiques!Quelque chose comme ça, il semble en direct.Je n'apporte pas le programme ici, car comme d'habitude, la construction de fenêtres occupe 95% du code. Il peut être trouvé ici.À l'avenir, le cerveau (smartphone) doit apprendre à transférer une vidéo normale (et non pas ce qu'elle est maintenant) vers un ordinateur, où elle devrait être reconnue de manière appropriée (pour l'instant, l'objectif est de construire un plan de salle au niveau du sol et de déterminer son emplacement). Eh bien, et déjà sous le communisme, je voudrais le porter sur mon smartphone pour qu'il n'ait pas besoin d'un ordinateur.Si au moins quelque chose fonctionne, je le posterai certainement. Merci de votre attention.