• Home »
  • automata »

    13 Schritt:Schritt 1: Psychic Hive Mind Fortune Teller in Aktion und Zusammenfassung dessen, was sie tut, Schritt 2: Design - Techniken für die Arbeit ein Konzept - von der vagen Idee, voll entwickelt gruselige Sache Schritt 3: Build - Making The Fortune Teller Kopf Schritt 4: Erstellen Sie - Hacking eine Tastatur eingeschränkten Dateneingabe zu ermöglichen Schritt 5: Erstellen - Erstellen einer Festplatz-style Sockel Fall aus Sperrholz Schritt 6: Techy - The Psychic Gehirn, seine Twitter app und seine Google Spreadsheet Admin-Interface Schritt 7: Techy - Brain Logik: Extrahieren Sinne von Dekonstruktion Live-Gespräche Schritt 8: Techy - Mit Arduino, um eine physische Knopfdruck senden tweet Schritt 9: Techy - Ein Mikro Auto-Monitor-Anzeige zur Visualisierung der inneren Hirn Schritt 10: Techy - Aufbau des visuellen Schnittstelle Schritt 11: Techy - Der vollständige Verarbeitungscode (und GitHub link) Schritt 12: Die Psychic Wahrsager-Lesung und seine tweet Übersicht - Testbeispiel Schritt 13: Weitere Informationen, Referenzen, Kredite, usw.

    Creepy Jahrmarktsattraktion und Twitter App! The Psychic Hive-Mind Fortune Teller ist ein Messegelände im Arcade-Art Anziehungskraft, die Ihr Glück sagen kann. Noch besser als dass, obwohl - es ist auch eine Web-Anwendung, die verbunden Twitter tweets ernten und erbrechen sie als Vermögen Messwerte können! Die Wahrsagerin liest den Geist eines twitter Diskussion. Es nimmt die Gedanken der Menschen von ihren Tweets, dann dekonstruiert sie in Basengehalt. Es rekonstruiert dann, dass Inhalte mit randomisierten Verbindungstextfragmente das Glück Lesen zu erstellen. Auf diese Weise schafft es Lesungen, die nicht nur einzigartig, sondern auch kontextspezifischer und vollständig up-to-date, da sie von der aktuellen Diskussion geschieht Live und in Echtzeit generiert werden. Sowie sprechen Ihre Glück und tweet es zurück zu Ihnen, es hat auch ein Fenster in sein Gehirn, durch die man die inneren Gedanken der twitter Diskussionen wird das Scannen zu sehen. Was können Sie von diesem Instructable bekommen? Diese Instructable zeigt Ihnen Hacking Social-Media-Daten an die Macht ein physisches Gerät Twitter - mit OAUTH Verbindungen zu Twitter Google Daten zugreifen - mit Tabellen und ihre Feeds so schnell und unsaubere Datenserver Arduino - wie man ein Computerprogramm Ereignis zu machen, indem ein ausgelöst werden physikalische Interaktion (Tastendruck) Box-Gebäude - wirklich grundlegende mit aufgeklebten Papierausdrucke als typografische schnelle Lösung Computer-Tastatur hacken - Umbau eines Standard-Computer-Tastatur als Schnittstelle beschränkt Consumer Auto-Video-Hardware als Display verwenden - wie eine Verbindung, eine primitive Auto-Video-Bildschirm als Monitor Verarbeitung - eine Skizze, die Twitter mit OAUTH zu ernten tweet Inhalt Verarbeitung verbinden können - die Verwendung von Text-to-Speech-Bibliothek für das Gespräch automatisch generierten Textverarbeitung - Randomisierte Satzbau für pseudo künstliche Intelligenz Verarbeitung - Visualisierung Informatik - mit einfachen Fernzugriff Admin-Einstellungen Hacking alten Audio-Kit - Hacken auseinander einen einfachen Computer-Audio-Verstärker, um den Ton Teileliste Leistung: Gesichtsmaske (optional) - Sand, Silikonform Gummi, Latex, Roll-on-Deodorant-Kugeln Kopf und Schultern - Ein gebrochenes Shop dummy Visualiser / Interaktion Bildschirm - Car Rückfahrmonitor und Grafiktreiber-Box Box - 6 mm Außensperrholz, Heißkleber (oder Holzleim), Holz off Schnitte, Farben, Lacke, Schrift auf Standard-Druckerpapier, Schrauben, etc gedruckt . Internet verbundenen Computer (kleines Laptop verwendet hier, aber wahrscheinlich ein Raspberry Pi funktionieren würde?) aktive Twitter-Account Alte Computer-Lautsprecher mit Verstärker Verarbeitung mit verschiedenen Bibliotheken gebaut installiert Türklingel drücken Arduino Board Werkzeuge benötigt: Computer - Wireless-fähigen PC (oder Mac, was auch immer Sie mit verschiedenen Bibliotheken, Arduino Umgebung Box verwenden) mit Verarbeitung 1,5 Umgebung - grundlegende Dinge - Handsäge, Stichsäge, Klebepistole, Pinsel, Sprühfarbe, Bohrer / Schraubenzieher usw. Head - in erster Linie nur Modellierungswerkzeuge für die Gesichtsmaske in Ton , Klebepistole zu bleiben auf. Fibre Filzstifte für Farbakzente Schritt 1: Psychic Hive Mind Fortune Teller in Aktion und Zusammenfassung dessen, was sie tut, The Psychic Hive Mind Fortune Teller ist so konzipiert, bei Veranstaltungen, wo Menschen versammelt und Online-Diskussion über Twitter nutzen. Wenn Menschen mit der Wahrsagerin zu interagieren, gibt sie ihnen einen Einblick in die Live-Twitter Gespräche um sie herum geschieht. Es ist wirklich eine Art von automoton, aber eine, die in den spezifischen Gespräch der Veranstaltung, an der sie vorhanden ist abgestimmt werden kann. Es muss nur bis zu der Veranstaltung gezielt eingestellt werden soll, dann wird er automatisch servieren Echtzeit-Reflexionen auf der Grundlage der digitalen Unterhaltung Geschehen um ihn herum. In der Tat, liest es die kollektiven Geist der Veranstaltung, also, warum es heißt die Psychic Hive-Mind Fortune Teller. Es kann leicht mit einfachen Admin-Einstellungen, die bestimmen, was es hört auf Twitter programmiert werden. Diese können aus der Ferne mit Hilfe eines Google-Tabelle als eine Web-Datenbank eingestellt werden. Hier ist es in der Tätigkeit am Museum-Technologie-Konferenz "MuseumNext", die im Mai 2013 in Amsterdam. Diese 47 Sekunden Clip zeigt, was ein ereignis goer Erfahrungen, wenn sie kommen über die Psychic Fortune Teller - im allgemeinen Verblüffung! . Zu haben, ihr Glück sagte, eine Person, die Interaktion mit ihm hat, nur um ihre twitterusername geben und drücken Sie eine physische Taste. Der Wahrsager der Twitter-App Gehirn liest dann Tweets in Echtzeit geerntet und zerlegt sie in ihre Einzelteile von Benutzernamen, Hashtags, URLs und andere allgemeine Worte. Es baut sie dann mit randomisierten Satzbau eher leftfield Rekombinationen erzeugen. Schließlich sendet sie einen Tweet mit einer Zusammenfassung des Vermögens Lesung zu der Person Twitter-Account. Der Wahrsager benutzt die irrestible Attraktivität ausgeflippt Messegelände Dinge und Stecker im Social Web, huckepack auf einige der zahlreichen Datenverbindungen, die in unserem digitalen Leben zu verfolgen. Bei der Verwendung von digitalen sozialen Medien sind Aspekte unserer kommunalen Verbindungen übersetzt und von Daten zurück. Der Wahrsager nutzt diese, um eine neue physische Wieder Manifestation unserer digitalen Interaktionen erstellen. Er überlegt, was es bedeutet, Teil einer großen kollektiven "hive" Gespräch, wie digitalen sozialen Medien werden zufällige und unerwartete Einblicke und Verbindungen mit Menschen auf Interesse geclustert und reflektiert über die Bedeutung der Austausch von Ideen, die im Internet zu sein. Aber vor allem ist es nur ein wenig gelegentliches :) Wie funktioniert es Der Automat ist mit einem Ereignis Diskussion, indem sie in Twitter angemeldet abgestimmt. Es ist so programmiert, tweets durch die Durchführung einer von drei Suchanfragen zu ernten. In der Regel ist dies ein #Hashtag suchen, aber es kann bis zu einerusername suchen oder einfach nur eine gerade Stichwortsuche tun eingestellt werden. Es extrahiert dann das Grundgehalt in vier Typen Die Benutzernamen der Personen, die die Tweets geschickt haben geerntet Hashtags in der Diskussionsrunde URLs schließlich eine große Liste aller Worte, die Menschen benutzt haben, um sich selbst auszudrücken gesendet werden. Es baut dann zufällige Glück Lesungen mit diesen Bedingungen, dass es spricht für die Besucher und tweets ihnen dann eine Zusammenfassung. Hier sind einige andere verwirrt aussehende Menschen! Schritt 2: Design - Techniken für die Arbeit ein Konzept - von der vagen Idee, voll entwickelt gruselige Sache Hier ist, wie ich arbeitete den Entwurf für das Ding. Ich begann nachzudenken, was eine gruselige Messegelände Kopf, der Tweets liest, aussehen soll! Es gab ein paar Einschränkungen und einige Wunschliste Wünsche. Ich wusste ungefähr, was ich suchte und hier ist, wie ich das Konzept, um eine reale Sache, die geeignet war komisch zu schaffen, sondern auch praktisch gebaut werden konnte. Die Hauptsache mit einer Jahrmarktsattraktion ist, dass es ein bisschen gruselig sein. Ich wusste, ich wollte, dass es erkennbar eine Person bei etwa normale Größe, aber das eine etwas ausgeflippt oder mutierte one! Der Text-zu-Sprache-Bibliothek war ich mit war eine männliche Stimme, so musste es sein male Es musste ein Mittel, mit dem der Benutzer konnte in seinen Geist zu sehen, um zu sehen, die Daten in seinen Gedanken Es benötigte eine Dateneingabe-Methode haben , damit die Benutzer zur Eingabe ihrer twitterusernames Es brauchte einen Sockel oder eine andere Halterung der ganzen Sache brauchte einen Rummelplatz vibe, so ist es notwendig, um gawdy Farben haben Habe ich erwähnt, es benötigt gruselig zu sein? I im wesentlichen erforderlich, um ein klares Bild von etwas in meinem Kopf, dass eine leicht gruselige Kopf mit einem großen Monitor war zu bekommen. Sobald ich auf, dass beschlossen habe, musste ich einfach mit möglichen Variationen zu spielen, bis ich über das Design aufgearbeitet schön. Die Technik, die ich für diese Art von Design-Entwicklung ist es, einfach zu ziehen viele Versionen von, was ich etwa nach bin. Diese Technik wird nicht versucht, eine genaue Gestaltung des endgültigen Objekt zu erzeugen (den Kopf in diesem Fall, und es ist Sockel). Die Idee ist, nur um Variationen zu erforschen, bis der richtige austritt. Der Prozess des Tuns los von Zeichnungen schnell ist gewollt zu vermeiden, zu einem der ihnen verbunden. Jede einzelne Zeichnung ist nicht wichtig, es ist die Stärke des geistigen "Gefühl" im Kopf, was zählt. Dies wird durch die Kombination aus all den Bildern festgestellt. Diese Methode kann nicht jedermanns Geschmack, aber es ist einen Versuch wert. Es funktioniert auf jeden Fall für mich. Sobald das endgültige Aussehen hergestellt ist, ich auch nützlich finden, um es neu zu ziehen ein paar Mal. Das gibt mir genug von einem Gefühl dafür, wie das fertige Sache, in der Lage, zu formen und bauen eine Veränderung auf sie später aus meinem Kopf zu sein. Es ist nicht ein Build Plan oder Entwurf aber. Es bleibt ein mentales Konzept. Dieses Design-Technik ist es, etwas im Gehirn, die nur eine allgemeine visuelle Form und eine Gesamt emotionale Gefühl zu beheben. Einmal im Kopf fixiert, helpd es führen die Hände später, wenn Bildhauerei und bauen es in 3-D. Im Folgenden sind einige der Design-Konzept-Skizzen. Bleistift ist gut, wie es so schnell für Stimmung Zeichnungen arbeiten in ist. Tintenfeder ist auch schnell und sauber. Das auf dem links unten war eine weiterentwickelte Version des Entwurfs. Mit Tinte, können Sie auch die Farbe separat zu. Die rechte Hand Version verwendet Promarker faser gekippt Federn, die wie ein Buntwäsche sind . Ungegenständlichen Zeichnungen Ich habe auch einige nicht-gegenständliche Zeichnungen, wie dieser zu helfen, aufzubauen, wie ich wollte, dass es das Gefühl, mehr als, wie es vielleicht look.It ist als Comic-Seite getan, vor allem, um ein Gefühl der narrative / Zeit in. Als ein Entwurf für ein interaktives, fühlte ich es brauchte etwas Gefühl für die Tatsache, dass es ist nicht festgelegt, sondern tut Dinge in der Zeit. Es ist zwar ein wenig rau, gelinde gesagt, ich finde es sehr hilfreich, um ein Gefühl der Interaktion sowie der physikalischen Objekts vermitteln. Schritt 3: Build - Making The Fortune Teller Kopf Dies ist, was der Kopf endete als. Ich denke, es erreicht die Absicht ganz schön gruselig. Der Leiter für diese Automaten wurde auf einer beschädigten Ausstellung Schaufensterpuppe vom Messe ballgowns an der V & A gebaut. Die Gesichtsmaske ist ein Latex-Test-Druckguss aus einer früheren Monstrosität (Twitr Janus). Es wurde in Stücke gespleißt und dann zurück Frankensteined, eine neue und noch gruseliger Version durch Umwickeln der Ebene Schaufensterpuppe zu schaffen. Hier ist das nicht wunderschön gemachte Schaufensterpuppe Torso, sah aus wie klassische griechische Marmor in der Sonne auf dieser azurblauen Tischtennisplatte. Schön gemacht obwohl diese Schaufensterpuppe wurde, nur der obere Teil benötigt wurde. Der Kopf und die Schultern brauchte off zu sägende, um einen flachen Boden zu verlassen. Das ist leichter gesagt als getan. Die wichtigste Sache zu richtig zu machen war die Kennzeichnung. (Prüfen Sie zweimal, sah einmal!) Der einfachste Weg, um ein Gefühl der Linie um den Körper zu bekommen war, Klebeband verwenden, in diesem Fall unser alter Freund Isolierband. Klebrig, aber nicht so klebrig, dass er streift die Lackschicht off! Eine weitere praktische Anwendung für das Wunder Band! Unten ist der Kopf. Der Körper ist GRP (Glasfaser), so dass die Sägespäne ist böse, gemahlenes Glas Lungentöte Zeug. Das nächste, was zu tun war, bekommen einige Augenhöhlen. Die Steckdosen sollten aus Deodorants wie gewohnt erfolgen. Die Augäpfel wurden eingeführt, um eine grobe Ort, um die Schablonen zu ziehen zu bekommen. Die orange Sache ist die Kugelaufnahme von einem männlichen deororant (es schlägt so auf dem Etikett zumindest) Also mehr rohe Operation für die Schaufensterpuppe. Bohren Sie an den Kopf, gefolgt von Stichsäge, schneiden Sie die Buchsen, autsch ... Und nicht schauen sie holen. Vage erinnert mich an den Film neun http://www.imdb.com/title/tt0472033/ und möglicherweise sogar Fantasic Planet https://www.google.co.uk/imghp?hl=en&tab=wi&authuser=0&q=fantastic_planet Enorm Als nächstes wird das ziemlich schön Schädel brauchte ein Gesicht, das ein Formteil aus Leinen los Twitr_janus ist, sondern in Stücke geschnitten und erneut angewendet, um die Form der Schaufensterpuppe passen. Wie üblich wurde dies mit dem herrlichen Heißklebepistole befestigt. Dieser stürmt slim-Bohrung Düse und kann verwendet werden, um unter die Haut injizieren. Die Stange unten ist mit einer Schraube aufgeklebt ist durch eine restriktive Schlucken, wo eine Hand passen nicht zugeführt. Einmal im Ort wurde mit Heißkleber fixiert und der Stab entfernt Unterhalb der Form des Gesichts wird gezogen, um als Führung für die Montage der Haut Gesicht auf zu handeln. Der Rest des Kopfes war leer gelassen werden. Das Gesicht ist sowohl eine echte Maske und eine metaphorische ein (wenn das nicht ein winziges bisschen meta!) Auf der rechten Seite der Monitorhalterung ist an der Befestigungsschraube davor montierten befestigt gezeigt. Die Bleistiftlinie wurde dann mit klaren Gaffer-Tape abgedeckt (clear so es immer noch zu sehen war!), Dann ist die Linie mit einem Skalpell zurück Das Band in der Linie wurde entfernt. Das Band ist da, um die umliegende Gegend Schädel painwork aus schmuddeligen Fingern, Chip, Kratzer und Heißkleber zu schützen, während der Arbeit auf sie. Die Gesichtsmaske wurde von Eigenschaften des Latex Gesichtsmaske aufgeklebt, und Verschnitt über Lücken gestreckt und getrimmt werden, um zu passen. Und dort haben Sie es. Die Grund Kopf, jetzt mit Gesicht ... Schritt 4: Build - Hacking eine Tastatur in eine verbotene Dateneingabe erlauben Der Wahrsager fordert den Benutzer auf ihrem Twitter-Benutzernamen eingeben. Um in dieser Funktion zu bauen bedeutete es eine Tastatur benötigen würden, aber eine, die nicht erlaubte es dem Benutzer, den Betrieb zu unterbrechen, entweder versehentlich oder absichtlich. Das rohe, sondern eher zufriedenstellende Lösung, um dies zu tun war, um zu hacken auseinander die Innereien einer Standard-Tastatur, dann entfernen Sie alle Steuertyp-Tasten, die tieferen Zugriff auf den Computer (Windows-Taste STRG, ALT, etc) zu ermöglichen, gerade aus der Buchstaben und Zahlen für die Dateneingabe. Dies ist, was die Tastatur sah aus wie nach der Modifikation. Es ist nett, aber ich würde es bevorzugt, ein bisschen mehr "fairgroundy" werden müssen. Es könnte ganz glücklich haben sich von Dampf punked oder Rummelplatz-punked oder etwas profitiert. Wenn es die Zeit erlaubt, möchte ich Holztasten geschnitzt haben oder vielleicht Bakelit oder Messing ... Wie auch immer, hier ist, wie die Tastatur Hacking war getan. NB- Hut ab vor Randolfo für diese ein. Ich habe seine große Instructable Hacking eine USB-Tastatur als Ausgangspunkt für diese Änderung. Auf der anderen Seite, die gute Sache über die Prüfung dieser Möglichkeiten ist, dass man, um durch Kunststoff in einer allgemein therapeutischen Weg zu hacken ... Vorher und nachher... Zunächst ersten abschrauben alles zu starten, um das Innenleben offenbaren ... Der Schlüsselmechanismus ist großartig ... Hacken Sie das Ende des Brettes des achtzehnten Jahrhunderts Schiff-Stil - mit einer Säge, dann planimg es nach unten - so angenehm! Das sah recht ordentlich im Frühjahr ... Aber unter all das, es ist eine ziemlich empfindliche Reihe von Kunststoff-Kreislauf-Matrizen. Diese erfassen die physikalischen Pressen von Tasten und nehmen Sie die entsprechende elektronische Verbindungen Leider gelang es mir, die erste Platte von einigen eher unsubtle Trimmen töten (subtltey ist nicht so mein Ding), so nehmen Sie zwei eher vorsichtiger. Schneiden Sie die Kunststoff und einfach falten Sie die Silikon und gedruckt Acetat Tastendruck Blätter ... Es gibt zwei Blätter von Kontakten, durch eine Abdeckfolie getrennt. Der obere Bogen eine Matrix von Elektroden, die mit entsprechenden Kontakten auf dem unteren Blatt verbinden. In der Mitte hat der Maskierungslage Löcher, die steuern, welche Kontakte berühren. Vor dem Falten der Blätter, die Kontakte für alle Tasten, die müssen (wie STRG oder WINDOWS oder ALT) neutralisiert werden müssen, berühren und damit die Aktivierung alles unerwünschte verhindert werden! Was man nicht wirklich sehen, hier ist das Klebeband verwendet werden, um dies zu tun. Dies wurde auf der anderen Bleche aufgebracht, um die Kontakte zu maskieren. Dieser brauchte etwas filigran-Level-Skalpell Arbeit rund um die Verschraubungen geschnitten ... Dies ist die Original Gaffer-Tape Versuch, die zu grob war ... Schließlich aber, arbeitete der zweite Versuch und die Senkung der Tastatur endlich geklappt .. Dies funktioniert, aber ich einzeln neu zu erstellen jede Taste wollen immer noch ... Schritt 5: Erstellen - Erstellen einer Festplatz-style Sockel Fall aus Sperrholz Sobald der Kopf gebaut wurde es notwendig eine Anzeige Sockel. Hier sehen Sie das fertige Sockel zu sehen, und unten ist, wie es gebaut wurde. Diese effektiv benötigt wird, um ein Feld groß genug, um die Tech, die es treibt Haus. Hauptsächlich ein Arduino, Verstärker, ein Videotreiber-Box und einen Mini-Laptop. Das erste, was zu tun war, um die Größe der Teile, die auf dem Feld standen werden musste überprüfen, und / oder in sie eingebaut. Dies bedeutete Einschätzen der Breite bezogen auf die Breite der Schultern des Automaten, und die Breite des abgesägten Tastatur. Das Bild unten zeigt ein Blatt ziemlich lecker 5.5mm Außen Sperrholz ist in rau, einfach, indem Sie die Teile auf es, die Positionierung mit dem Auge und dann das Zeichnen von Linien als Führer gekennzeichnet. Das schwarze Quadrat wurde es richtig und exakt auf den rechten Winkel zu halten. Daraus war ein Spitzenbrett ersten Schnitt zu Breite und ungefähre Länge (unten) ... Die Tastatur wurde aufgestellt, um die Platzierung richtig zu machen ... Die obere Platte wurde dann in zwei Teile (siehe unten) zu schneiden. Dies, da die benötigte Tastatur, um den Nutzern eine Vorwärtsneigungswinkel dargestellt werden ... Der Abschnitt, der verwendet würde, um die Tastatur zu montieren, wird nachfolgend mit der Papierschablone mit Gaffatape befestigt gezeigt. Nach der Markierung wurde eine Stichsäge verwendet zum Ausschneiden der Tastatur Loch, damit die Montage an der Unterseite. Hier ist die Tastatur, sitzt ziemlich fest in der Platte ... Der Laptop unten ist ein Notebook (dh die Kleinen), so dass Sie die Skala mehr oder weniger sehen ... Springen vor ein wenig, in den Schuss unten können Sie sehen, der andere Teil des Topboard hat an dem vorderen geneigten Tastatur Montageplatte ausgestattet, mit zwei Seitenplatten, die Grundfeld zu machen. Es ist die Vorderseite, Rückseite und Basisplatten fehlen. Die Höhe wurde durch die Notwendigkeit, den Laptop in der Box bei der Ausführung des Automaten später offen geregelt. Auch unten ist der Kopf positioniert ist, um zu kennzeichnen, einige Führungslöcher, um es in das Basisfeld zu suchen. Aus diesen Markierungen Löcher in der Spitze der Box als Positionierungslöcher für die Schultern des Automaten zu sitzen geschnitten wurden. Die Schultern gesenkt, um die Passform (unten) zu testen ... Und die Schultern sitzen im Ort ... Sitzen im Ort der Kopf sah so aus ... Müsse es auch einen Lautsprecher. Ein Loch wurde in der Mitte der vertikalen Frontplatte geschnitten, um diese zu passen. Der Lautsprecher und ihre Treiberverstärker wurden von einem Computer-Audio-Verstärker gehackt. Sie können die Lautsprecher durch, die in diesem Bild sehen. Die Rillen sind da, um die Lautsprechergitter zu lokalisieren. Diese wurden mit Metallsägeblatt Lauf gegen ein Stück Holz geschnitten, um sie gerade entlang der Führungsmarkierungen zu halten. Die folgende Aufnahme zeigt den Lautsprecher aus dem Inneren der Box. Die Verstärkerschaltung ist in der unteren rechten, auf eine Holzgehäuse angebracht und mit Schrauben gesichert. Hier ist der Kopf wieder, mit dem Lautsprecher zeigen. (Unten) Hier ist eine Rückansicht, die den Laptop offen und in der Box läuft. Um es ein Jahrmarktsattraktion fühlen zu geben, wurde das Feld ein grell rot lackiert. Das Feld auf der linken Seite zeigt die rohe Holz mit der Tastatur und oberen Löcher mit Gaffer-Tape maskiert, um Farbe zu stoppen bekommen in. Die rechte Aufnahme zeigt die Box nach mehreren Schichten von roter Farbe. Das war normales Auto Sprühfarbe. (Aceton-basiert) Zum Messegelände Stimmung weiterhin wurde das Label Wortlaut in großen Buchstaben gedruckt (ca. 90pt glaube ich), in Streifen geschnitten, dann gelb mit Filzstiften (ProMarkers) gefärbt. Einige Pseudo-Fading wurde mit Schichten von braun und grün schwach transparent Pigment ProMarkers angewendet. Man kann nicht wirklich sehen dies in diesem Schuss. Der Schriftzug wurde anstelle mit Bostick (clear Fumey Allzweckkleber) angeklebt und wurde mit 3 separate Schichten schnell trocknend Glanzlack lackiert, um alles zu versiegeln. In der Aufnahme Hier können Sie das pseudo-Aging klarer zu sehen. Damit sollte Lack vergilbt mit dem Alter zu imitieren. Und hier (unten) ist der fertigen Schachtel. Die Metallfolie Lautsprechergitter wurde separat mit gelber Farbe gesprüht, um die Beschriftung, dann mit Kabelbindern an Ort und Stelle hält es innerhalb der Gehäuserillen, die zuvor in das Feld geschnitten worden war, um ihn zu suchen festen entsprechen. Unten ist, wie es aussieht von der Rückseite mit der Rückwand entfernt. Der Laptop ist im Inneren passen. Hinter dem Laptop sind das Arduino Board (verwaltet die putton schieben Aktionen), die Audio-Verstärker und ein Videosignal-Konverter. Dies macht den Standard-VGA-Monitor-Ausgang aus dem Laptop arbeiten auf dem TV-Typ-Monitor, der auf dem Kopf des Automaten sitzt. Der Monitor ist ein geschlossener Kreislauf Fernsehmonitor normalerweise als eine Rückfahrmonitor in einem Auto verwendet wird. Unten ist ein Bild von den verschiedenen Dinge benötigt, um in der Box gestopft werden. Eine wichtige Sache zu beachten ist, dass der Kopf nicht auf den Sockel aufgeklebt. Es kann entfernt werden und ist nur mit einer Schraube gesichert. Diese Haltebolzen unter ganz links sichtbar (links von der Arduino-Board). Es ist eine einfache Gewindebolzen mit einem Holzblock auf sie Gewinde, lose an Ort und Stelle mit Nüssen statt. Der Grund für die nicht Kleben Sie den Kopf auf dem Feld ist, so kann es außer für den Transport berücksichtigt werden. Hier wird es in einem Koffer gezeigt, gerade dabei, nach Amsterdam getroffen, um an der Konferenz MuseumNext demonstrieren. Der Kopf ist in der Box. und das ist it.Step 6: Techy - The Psychic Gehirn, seine Twitter app und seine Google Spreadsheet Admin-Interface The Psychic Wahrsager funktioniert durch die Rekonstruktion kontextuellen Inhalt einer Heran spezifische Diskussion in Twitter geerntet. Es tut dies mehr oder weniger in Echtzeit. Alle 10 Sekunden für jede neue Inhalte in der Regel überprüft er, aber das kann in den Admin-Einstellungen geändert werden. Was es sieht für Twitter ist als eine Reihe von Admin-Parameter definiert. Dies wird in seiner aktuellen Admin-Einstellungen, die remote geladen werden (siehe unten für weitere Details) gesetzt. Die Einstellungen werden in einer Google-Tabelle an anderer Stelle gespeichert. Dieses Bild zeigt, wie es funktioniert Es greift auf die Twitter-API, um Tweets, dann Prozesse zu ernten und sortiert den Inhalt der Tweets in Listen von Wörtern, #hashtags,usernamesand URLs. Herstellen der Verbindung zu Twitter von Verarbeitung Offensichtlich, um Tweets zu bekommen, muss es um Twitter zu verbinden, und um dies zu tun, einen eigenen Twitter-Account (rbeetlelabs) nutzt. Dieses Konto wird verwendet, um die Wahrsager als offizielle Twitter App registrieren. Dies ermöglicht es, auf Twitter zu verbinden mit Open-Authentifizierungsschlüssel und die API Suchanfragen benötigt, um die Tweets für die Verarbeitung zu extrahieren zu machen. Ich werde nicht versuchen, neu zu schreiben, Anweisungen zum Einrichten eines neuen Twitter-Account. Das ist eigentlich ganz einfach, aber, wie es geht im Laufe der Zeit ändern. Am einfachsten ist es, um zu Twitter Entwicklerseiten: https://dev.twitter.com/docs Im Wesentlichen, wenn Sie eine Anwendung mit Twitter ein Profil, erhalten Sie 4 große Zeichenfolgen, die als Sicherheitsschlüssel zu genehmigen und API Verbindungen von diesem App verwendet. (Dies ist die offene Authentifizierung OAUTH) Der twitter app ist mit dem Gehirn verbunden Psychic. Dies ist eine Verarbeitung Skizze, die ständig läuft. Die Verarbeitung Skizze verwendet eine Java-Bibliothek namens Twitter4J (Twitter für Java, geddit?). http://twitter4j.org/ Twitter4J ist Open Source und wenn auch ein wenig fummelig zu importieren, funktioniert gut. Er sorgt für die Verbindung zwischen der Verarbeitungs Skizze und Twitter. Sie müssen die OAUTH Schlüssel in Ihrem Verarbeitungs Skizze zu speichern, und die Twitter4J Bibliothek hat eine Reihe von Klassen und Verfahren, die Sie fordern, um Verbindungen herzustellen. The Psychic Wahrsager verwendet 2 Twitter4J Methoden suchen (Abfrage), die Suche macht Anrufe auf die Twitter-Suche-API   und update (Status), die den Twitter-Account, indem Sie einen Tweet aktualisieren. Die vollständige Dokumentation zur Verwendung des Twitter4J Bibliothek finden Sie hier: http://twitter4j.org/en/api-support.html Google Spreadsheet als Admin-Interface Sobald die Verarbeitung Skizze hat den Twitter-Handshake-Verbindung hergestellt, macht es eine API-Suche. Was es für die durch Admin-Einstellungen, die in einem Google-Tabelle gespeichert sind, gesteuert sucht. Dies ermöglicht ihnen, aus der Ferne über das Internet eingestellt werden. Die wahre Schönheit von Google-Tabellen ist, dass man sie zugänglich wie Daten wirklich einfach und ohne API-Schlüssel oder Authentifizierung zu machen. Dazu müssen Sie nur veröffentlichen sie im Internet. Natürlich ist dies nicht etwas, das Sie für sensible Daten machen können, so sollten Sie nicht verwenden, die Tabelle, um Ihre OAUTH twitter Tasten speichern (das wäre auch vertrackt sein!) Um auf die Web zu veröffentlichen, verwenden Sie die Datei-Menü In das zu veröffentlichen, um Dialogfeld Web das Kontrollkästchen "Automatisch neu veröffentlichen, wenn Änderungen vorgenommen werden" -Option. Dies bedeutet nur, dass, wenn Sie Einstellungen zu aktualisieren, gehen sie auf die Bahn automatisch. Dieses Dialogfeld ist, wo Sie die Daten URL, die Sie in Verarbeitung verwenden können. Dies ist, wie es in der Verarbeitungscode verwendet wird. Wenn Sie auf die URL, wird ein Array in Bearbeitung, die ist bequem mit den Admin-Einstellungen gefüllt erstellt, so dass Sie sie, wie Sie bitte - sweet! void loadRemoteAdminSettings () { try { String checkRandomSpeech = adminSettings[8]; adminSettings = loadStrings("https://docs.google.com/spreadsheet/pub?key=0AgTXh43j7oFVdFNOcGtMaXZnS3IwdTJacllUT1hLQUE&output=txt"); if ((checkRandomSpeech.equals(adminSettings[8]))!=true) { tts.speak(adminSettings[8]); } In diesem Beispiel wird verwendet, um zufällige Nachrichten an den Psychic Wahrsager zu senden. Für das Gesamt Procesing Skizze und was jeder Teil hat siehe Schritt 7 Schritt 7: Techy - Brain Logik: Extrahieren Sinne von Dekonstruktion Live-Gespräche Erstellen Sie ein Automat sprechen Zufalls Scheiben Tweets der Menschen ist eine Sache, so dass sie annähernd zu einem einigermaßen matischen oder verständliche Begriff ist etwas ganz anderes. Es fiel mir der Schlüssel dazu liegt im Umfang der strukturierten und Klassifizierung, die innerhalb Tweets (oder nicht!) Bestehen können suchen. Zwar gibt es nicht viele von ihnen, gibt es einfache Grammatikregeln auf Twitter verwendet, die im Allgemeinen in einer konsistenten Art und Weise eingesetzt werden. Es gibt auch einige Gemeinschaftsgefühl Etikette, die überwacht und diese Standards. Die wichtigsten sind unten aufgeführt, mit einer gewissen Hinweis darauf, wie diese Bedeutung verwendet werden könnten username - jedes Wort mit einem @ vor, es ist sehr speziell a twitter Benutzernamen ein. ZBrosemarybeetle. Dies ist äußerst nützlich. Wenn einusername wird gekennzeichnet, wird die Person entweder in Diskussion oder direkt alarmiert / eingeladen, beitragen. Trennung dieser heraus gibt eine Liste Personen an der Diskussion beteiligt - sehr praktisch! #Hashtag - das ist twitter Grammatik für ein Gesprächsthema. Nach ihrer Annahme ein hashtag soll nur für einen bestimmten Thema verwendet werden. Daher Hashtags sind sehr nützlich, und wenn getrennt eine Liste von Themen geben diskutiert oder verwiesen wird. Es gibt einen speziellen Fall, wenn das Extrahieren Hashtags, die, wie man die Hauptdiskussions hashtag behandeln zu behandeln ist. Dies ist der Leim eines twitter Diskussion, sondern in Bezug auf die Häufigkeit des Auftretens verdrängen alle anderen Hashtags. Doch wie dieser hashtag id Regel, was wird verwendet, eine Suchabfrage Begriff, Handhabung ist einfach, da die Abfragebegriff kann ausgeschlossen werden, wenn erforderlich. Es gibt einige andere Veränderungen auf Hashtags. Zum Beispiel einige Hashtags für ein wiederkehrendes Ereignis kann eine Wurzel und eine Datumsmodifikator haben - zB # MW2012, # MW2013 usw. Hashtags oft Akronyme werden und es gibt auch einige Gelegentlich acronymous (ist, dass auch ein Wort?) Hashtags, die führen können, zu Verwirrung. Zum Beispiel die hastag #rdg ist seit einiger Zeit von einer lokalen Zeitung verwendet worden, um die Stadt von Reading, UK spenden, aber die Popularität der japanischen Anime Roten Mädchen führte zur #rdg Hashtag wird weithin angenommen, um zu verweisen. http://www.getreading.co.uk/news/s/2132218_red_data_girl_fans_twitter_storm_over_rdg_hashtag URLs - das ist der twitter Äquivalent einer Referenz. Dies sind in der Regel nicht die tatsächliche URL, aber eine verkürzte Weisung url. Auch diese wurden als wert Abtrennung, wie sie sind Ressourcen mit der Diskussion assoziiert und führen zu mehr in die Tiefe Ideen, die zu lang für die Darstellung auf Twitter RT oder RT sind: - (ReTweet) ist dies die Standard-Etikette für die Anerkennung eines Tweets als gesendet wird, nicht original ist tweet ist jemand anderes gesendet an. Es ist gleichbedeutend mit einer traditionellen Kredit. Wenn durch eineusername gefolgt, gibt es eine implicaton, dass dies die Person, die den ursprünglichen Tweet geschickt, aber das ist keine strenge Regel. Während RT nützlich sein könnte, wurde beschlossen, nicht zu stören, um Benutzernamen, die nicht erwähnt werden gutgeschrieben oder VIA enthalten sein könnten unterscheiden - ähnlich wie bei RT, ist dies in der Regel eine Bestätigung, dass dies eine Sekundär retweet, die Benennung der Person, die es geschickt auf . Es ist fast immer der Fall, dass eine folgendeusername ist die Person, die es zunächst retweeted. "Wörter in Anführungszeichen" - Anführungszeichen werden als Abkürzung für ein direktes Zitat aus einem anderen Tweet verwendet. Flussdiagramm Hier ist das Flussdiagramm von Schritt 6 erneut. Die Verarbeitung Skizze, wie jeder andere, hat eine Last von Initialisierungscode sowie eine Belastung von Funktionen deklariert. Es hat auch die Standard-Looping-Funktion draw (). Dieser läuft kontinuierlich, wenn die Skizze läuft und führt verschiedene Code, macht Kontrollen und ruft Funktionen nach Bedarf. Der Algorithmus für die draw () Funktion, vereinfacht gesagt, fließt etwas davon. Überprüfen Sie das Remote Admin-Einstellungen zu laden Fernsatzfragmente Aktualisieren lokalen Admin-Einstellungen mit den neuen Versionen bei Bedarf Ernte tweets nach Admin-Einstellungen Strip aus Stoppwörtern (wie "der", "und", etc.) Split tweets in Komponententypen Worten hashtags , Benutzernamen und URLs Aktualisieren Sie lokale Speicherzeitraster für jeden Typ mit den neuesten Werten Hören für Tastendrücke Wenn Taste gedrückt: erstellen Vermögen von tweet Inhalt zufällig mit Satzfragmenten kombiniert nach Glück Bau Ausdruck sprechen tweet mit Text-to-Speech tweet Zusammenfassung Benutzer Fortune-Bau Die Satzfragmente sollen neutral zu sein, so dass sie mit Twitter Diskussion der Content aus allen Twitter-Suche verwendet werden. Diese werden nach dem Zufallsprinzip aus vier Nachschlagetabellen ausgewählt. Der Inhalt jeder dieser Tabellen in den Bearbeitungs Skizze von einem separaten Google-Tabelle gezogen wird. Angezeigt werden die Inhalte dieser Tabellen zeigen die aktuellen Werte zum Zeitpunkt der Niederschrift dieses Instructable. Diese sind nicht festgelegt und können jederzeit geändert werden. In der Tat können sie Live geändert werden, während der Psychic Wahrsager ist in Aktion. Das ist, weil es überprüft die Inhalte dieser Tabellen mit der gleichen Geschwindigkeit er die Admin-Einstellungen und Abstimmungen Twitter prüft. Gesprochene Fortune- Hier ist das Diagramm für jedes weiße Feld Hier wird eine entsprechende Tabelle von Istwerten unten enthalten ... Die Funktion, die das Glück schafft innerhalb der Psychic Gehirn ist: void readFortune (String tweetText) { int picW1 = int(random (words.size())); String fortuneWord1= words.get(picW1); int picW2 = int(random (words.size())); String fortuneWord2= words.get(picW2); int hash = int(random (hashtags.size())); String fortuneHash= hashtags.get(hash); int urler = int(random (urls.size())); String fortuneUrl= urls.get(urler); int userer = int(random (usernames.size())); String fortuneUser = usernames.get(userer); int frag1Int =int (random (fortFrags1.size())); String fraglet1 = fortFrags1.get(frag1Int); int frag2Int =int (random (fortFrags2.size())); String fraglet2 = fortFrags2.get(frag2Int); int frag3Int =int (random (fortFrags3.size())); String fraglet3 = fortFrags3.get(frag3Int); int frag4Int =int (random (fortFrags4.size())); String fraglet4 = fortFrags4.get(frag4Int); fortune = "Psychic summary for @"+tfUserCurrent + ". for: #"+queryString+". "+ fortuneWord1+", "+ fortuneWord2+", #"+fortuneHash+ ", @"+fortuneUser+", "+fortuneUrl+". Enjoy/RT"; println ("just before fortune spoken"); fortuneSpoken = "Hello. "+tfUserCurrent+". "+adminSettings[7]+ ". "+fortuneGreeting +". Here. you are. Your Psychic Hive Mind. Fortune. based on reading .the collective mind of. "+queryString+". is. "+fraglet1+". "+ fortuneWord1+". "+ fraglet2+". "+fortuneWord2+". "+fraglet3+". hashtag."+fortuneHash+ ". "+fraglet4+". Twitter user."+fortuneUser+". Thank you. I have tweeted a psychic summary of this reading to your twitter account. Moove along now. " ; println ("fortuneSpoken= "+fortuneSpoken); } The script is looking at the size of the array storing the fragments, then obtaining a random value from the array by requesting the element that is an random integer between 0 and the max number of elements. Here are examples of the phrases used (current values at time of writing) Sentence fragment 1 - (INTRO) The first Google lookup table contains sentence openers to get the fortune started. Current values are... Perhaps you would be advised to try It could be that Don't assume always that Have you pondered Try something different like Maybe its You might like Grasp the Believe in a beautiful How you feel about Something unexpected like An unexpected issue like The intro is followed by... + Twitter word + A random word from the harvested list of Twitter terms currently in use is inserted. This is followed by... Sentence fragment 2 (CONNECTOR) This fragment is a short connector. It will connect the first word with a second, also pulled from the harvested list of Twitter terms currently in use. ZB back to also und beide but what if or maybe not only but und always hardens the möglicherweise more clearly and the wichtig goes towards It is followed by... Full stop The second Twitter term ends the first part of the fortune reading, so it gets a full stop. Sentence fragment 3 (#HASHTAG) This fragment invites the user to consider a hasttag that has been tweeted within the current collective discussion. It is intended to expose the user to one of the subjects under discussion.Eg Also think, you might like to seek out But perhaps a conversation would help with Some new ideas may come from talking to You may be surprised to know what you can learn from And don't rule out sharing ideas with someone like You may have something in common with Try finding things in common with Find out more about the work done by It is followed by... Twitter #hashtag As you might imagine. Sentence fragment 4 The final sentence fragment introduces a Twitter user. This user is specifically someone who has sent one of the tweets being harvested, NOT someone mentioned in them. In other words this fragment is being used to deliberately highlight a current contributor to the discussion. ZB Also think, you might like to seek out But perhaps a conversation would help with Some new ideas may come from talking to You may be surprised to know what you can learn from And don't rule out sharing ideas with someone like You may have something in common with Try finding things in common with Find out more about the work done by And there you have it. Tweeted fortune summary The spoken fortune is a central part of the live intreraction. However, given the Fortune Teller is designed to be used in a hectic environment, a second summary is also generated which is intended as a reminder for the user, of the reading. This is tweeted to the user. This is similar to the above spoken fortune, but is much simpler in construction. Mainly because as it has to be tweeted, it has to be 140 characters or less. Here is the diagram representing this and the code: fortune = "Psychic summary for @"+tfUserCurrent + ". for: #"+queryString+". "+ fortuneWord1+", "+ fortuneWord2+", #"+fortuneHash+ ", @"+fortuneUser+", "+fortuneUrl+". Enjoy/RT"; println ("just before fortune spoken"); One thing the summary includes that the spoken fortune does not, is a random URL. Once again, this is taken from the live discussion and is specifically a URL that had been shared and therefore a resource presumably of added interest to the discussion. The reason the spoken fortune does not contain URLs is simply because they are frequently unintelligible when spoken via text-to-speech. Limitations of auto-generated fortune readings The method shown above, of creating fortune readings from auto-harvested tweet content, is crude to say the least. Not surprisingly, the random (or semi-random) connection of terms used to create fortunes has some rather unpredictable results. These are quite often a little strange, but ocassionally you get a really quite surprisingly good juxtaposition. A bit like a leftfield haiku :)Step 8: Techy - Using Arduino to make a physical press of a button send a tweet One thing that I wanted for the Psychic Fortune Teller was that it required a physical interaction. It has a keyboard needed for data entry, so I could have just used the return key on that. However, this felt not quite enough for a fairground/arcade type experience. I wanted the user to have to make a much more obviously deliberate action to get their fortune told. Clearly this was where a handy Arduino was always going to be the solution! I fairly quickly knew this would be a button. Eventually I decided on a good old doorbell... The doorbell circuit is extremely simple The full Arduino skethc is available on GitHub here: https://github.com/rosemarybeetle/psychic-fortune-teller The same Arduino sketch with some annotations is shown below. You can see it's pretty simple. It looks for a button press (as in the circuit above) /* Fortune Teller Hive Arduino board code Needed to control physical interaction... and relay physical-detection data back to Processing mothership! */ The next line is defining a variable (switchPin) to store an interger, that will be used to define which analogue input will be used. int switchPin = A0; // Analogue in = A0, called switchPin. The next line defines a variable to show which PIN an LED is attached to int led = 13; // LED pin... The next line is the initialisation for the analogue input variable int analogValue = 0; // this is used to determine whether to make a call to Twitter (if high) Initialise timer period... float timerPeriod=5000; //don't send data more often than this Initialise a timer variable... float timerSend=millis(); Initialise a second comparison timer variable float timerCheck=0; The setup function... void setup() { Make a serial connection at baud rate 114200... Serial.begin(115200); Send confirmation message across serial USB port. This is used in testing Serial.write("Serial connection initiated"); // initialize the digital pin as an output. pinMode(led, OUTPUT); } // the loop routine runs over and over again forever: The main loop function... void loop() { The next line is making the Arduino check for any analogue signal to the analogue pin 0... analogValue = analogRead(switchPin); If the doorbell is pressed, then the input to analogue pin 0 will be 5V. This is equivalent to 1024. The IF statement has a threshold of 900 (about 4.5V) if (analogValue >=900) { reset first Timer variable (timerSend) timerSend=millis(); Check if period between now and last reset (timerSend-timerCheck) is greater than default period (timerPeriod) NOTE initially this will be true. After the first press it will be false until a period has elapsed. This is preventing accidental multiple sends of serial data which might cause the Fortune Teller to try to speak the same thing several times if ((timerSend-timerCheck)>timerPeriod) { Send the coded message "fireTweet" to the Processing script over the serial (USB) port Serial.write("fireTweet"); Once sent reset the check timer variable. This will be usd in the IF check to prevent refiring too early timerCheck=millis(); analogValue = 0; // reset - this is used to ensure the value is reset after a successful release of the switch // ADD ANY OTHER TRIGGERS HERE THAT COME FROM THIS INTERACTION } } } . Step 9: Techy - A micro car-monitor display for visualising the inner brain A key feature of the design of the Psychic Fortune Teller was that it should have some means of seeing into its brain. I wanted people using it to be able to see where the content it speaks comes from, by displaying it a live graphic visualisation. This mean it needed a monitor that would display this visualisation. I considered several possible sources for a screen. It needed to be small enough to use with a normal sized head, but the display needed to be big enough to actually read. I initially had wanted to hack the screen from a DVD player, as these are small and have a fairly good screen resolution, needed to for playing DVDs back. There were some useful examples, such as this one on Instructables from computerwiz_222 http://www.instructables.com/id/Use-your-Portable-DVD-Player-as-a-Monitor/ This was a great Instructable, but required the DVD player to be a model with a video-in connection, which many do not have. I didn't want to pay the full price for a new one to achieve this, so this would have meant getting lucky with a second-hand one. I couldn't easily find one on e-bay, but in the process discovered an alternative consumer product that was just what I was after as a source of a small display - in-car monitors! It turns out that cars use a range of monitors mainly within closed circuit TV reversing warning systems which need to be small enough to fit on car dashboards, or for in-car entertainment (ie using as as display on the back of seats, to shut your kids up on a journey!). They are an established product with a massive market, so there was a good range of sizes available including 2.5", 3.5", 4.5" and so on. They also crucially are available as a separate part for making up your own reversing camera system and come with a video inpit as standard - perfect! There were also loads available and they were cheap enough to buy new off ebay. The only compromise in using them is that the display quality is not intended for watcjing DVDs. It is just good enough to see if your about to mash up your car whilst parking. In the end, I bought a 7" screen, which was slightly larger than I had originally intended, but anything smaller would not have been legible due to the fairly low screen resolution. One thing I hadn't realised in advance is that because they are not made for connection as a computer screen, they only work with video line in. They almost all come with standard VGA connectors. Check this! However, although these RCA connectors are standard and allow easy connection, the screens are really being connected like a very small television. They don't come with computer drivers. This means that you can only connect them directly to a computer that has a specific line out. This usually only means computeres designed to allow you to connect them to big consumer TV screens, eg for gaming. Luckily, there is a handy and fairly cheap fix, which is to use a video convertor box. This takes an input from a standard VGA monitor output (this is the standard blue rhomboid connector for connecting projectors etc) and converts it into the video line signal that the mini monitor needs. Here's what they look like. They are powered by USB Anyway, these screens are very handy, dead easy to get hold of and reasonably cheap. I recommend considering them as a cheap and cheery solution. Step 10: Techy - Building the visual interface Stare deep into the collective brain... One of the key features I wanted for the Psychic Fortune Reader was that it be possible to see into its mind in real time as it is scanning the collective thoughts of the Twitter conversation. The screen on its head is a window into its brain. It also needed to have a simple form box area to allow users to interact by entering their Twitter username. Visualising the discussion I wanted the visualisation is to be a randomised animated something, but I wasn't sure what would work. While wandering about the web trying to get ideas, I came across a rather good visualisation example by Jer Thorp. Respect to him for putting out such a clear example. His visualisation is essentially using Twitter to get a word list, then presenting this by displaying these word at random positions on the screen. Here's his very admirable and handy example. http://blog.blprnt.com/blog/blprnt/updated-quick-tutorial-processing-twitter Jer's example has a simple white text on black and works by calculating the screen size, then randomly placing the text within those boundaries. I played with this code. I had not one, but four subsets of data types: words, hashtags, usernames and URLs. I gave each of these a distinguishing colour and size range. For each type of data, the words are displayed with a distinct colour and the size ranges between a min and max value. This worked quite nicely. Here is a visualisation of a discussion at MuseumNext in Amsterdam May 2013 Interaction elements of the interface The other need was for a user input area. This was handled by a convenient Processing library called ControlP5, written by Andreas Schlegel, another person deserving of respect for their free sharing of this very handy library. www.sojamo.de/libraries/controlP5/ The form is extremely simple and is a backing banner band, a text input and a text label... Iterations To get to the final visual interface design above, it was developed in stages. The first stage was monochrome, based on Jer Thorp's code. These four screenshots show the rather cumulative white-out effect that this original script produced. This was good, but not intelligible enough... This was developed to the eventual four-colour display, with greater control over variable sizes and a much faster fade to black, which exposes the words much more distinctly and clearly overall. This example below is a test reading at Museums and the Web 2013. It appears much more clear because it is a screen shot of a reasonably high screen resolution on a desktop PC display. When scaled down the words were unreadable, so the font size had to be dramatically increased to be legible on the smaller, lower-resolution car monitor. You can also see that the form design is not yet finished at this stage. Step 11: Techy - The full Processing code (and GitHub link) By far the most important part of the Psychic Fortune Teller is its psychic brain, written in Processing. The full code for the psychic brain is on GitHub for free reuse under GNU GPL. You should refer to this for forking or copying the code as it will get any updates I bother to make. https://github.com/rosemarybeetle/psychic-fortune-teller The code below is the full Processing sketch at time of writing, with basic notes that show where some of the features discussed in this Instructable are featured in the code. It has quite a lot of information in the code comments, so here I am merely signposting the broad sections of code and what they do. The idea is that if you only want to reuse some features, you can find the code block you need, hack it up as you like and ignore the rest. Note that there are a number of imported libraries, so you need to include these. Terms of use = use it freely. I hope it helps you build stuff :) More or less you can do what you like, except try to copyright it or restrict reuse by others of this code, or your new code based on it. It is also based in part on other people's efforts before me. Respect to them. If you manage to make any use of it, I'll be pleased and suggest you put yours back out there. Here are some credits... Acknowledgments Twitter4j Yusuke Yamamoto (and others I believe?) Twitter4j is a java library that does the connection and transaction handling between Processing and Twitter. This is what enables simple connection to harvest the tweet content, and to send tweets, both from withing the Processign brain. EINDRUCKSVOLL. github.com/yusuke/twitter4j/network GURU text-to-speech Nikolaus Gradwohl The GURU text to speech library for Processing, is a key bit of code. It is what allows the Psychic Fortune Teller to talk to you. www.local-guru.net/blog/pages/ttslib ControlP5 Andreas Schlegel ControlP5 is a Processing library used to handle creation and control of user interfaces in the Processing draw() window. It's used for the twitter username entry box www.sojamo.de/libraries/controlP5/ Visualisation JER THORP The visualisation of words on screen is based on an example sketch by Jer. blog.blprnt.com/blog/blprnt/updated-quick-tutorial-processing-twitter Full sketch with some interpretation Version 9. This is the Psychic brain Processing sketch at the time of release of this Instructable. Any amendments will be on the Git repo https://github.com/rosemarybeetle/psychic-fortune-teller Credits // ----------------------- // ---- // PSYCHIC FORTUNE TELLER // @rosemarybeetle 2013 // http://makingweirdstuff.blogspot.com // version 9 /* ----------------------- This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . ---------------------- */ // // This sketch is the mind control of Psychic Fortune Teller, an automaton that can read the collective mind of twitter // It has a Processing brain connected to a Twitter app, connecting via OAUTH // It harvests tweets from predefined searchs // Deconstructs the weet content into words, hashtags, usernames and urls // Then uses these to create fortune readings, which it speaks using text-to-speeach // it also tweets a summary. // // RESPECT to... // // JER THORP - Visualisation is based on his code example // see http://blog.blprnt.com/blog/blprnt/updated-quick-tutorial-processing-twitter // Awesome! // // The people behind twitter4j // see https://github.com/yusuke/twitter4j/network // using here, version 3.03 // NOTE - you have to have the twitter4j library installed in the libraries folder for this to work! // You need to register your app to get OAUTH keys for Twitter4j // You can put them in a separate tab in your sketch // // Andreas Schlegel - controlP5 GUI Library // see http://www.sojamo.de/libraries/controlP5/ // For positioning see (also @@@ Andreas Schlegel @@@) - // https://code.google.com/p/controlp5/source/browse/trunk/examples/controlP5button/controlP5button.pde?r=6 // ---- // Nikolaus Gradwohl for the GURU text to speech library for Processing // see http://www.local-guru.net/blog/pages/ttslib // ----------------------- // ----- initialisation // >>>>>> boolean serialCheckInt=true; boolean grabtweetCheckInt=true; boolean loadSettingsFirstLoadFlag=true; boolean loadstopWordsCheckInt=true; // <<<<<< end load flags // >>>>> fortune variables initialisations int tweetTextOutro = int (random(99)); String tweetSendTrigger ="fireTweet"; String fortuneGreeting = "I have stared deep into the hive mind. "; String fortune = ""; String fortuneSpoken = ""; int widthRandomiser = 120; // <<<<<< // >>>>>> gui variables init... String tfUserCurrent =""; // used to check what is in the username text box String tfTextCurrent =""; // used to check what is in the free-text text box int valFocus = 0; // default color focusBackgroundColor = color (255, 255, 00); color focusOffBackgroundColor = color (0, 0, 0); color focusOffColor = focusBackgroundColor ; color focusColor = focusOffBackgroundColor; color clPanel = color(70, 130, 180); // <<<<<< // >>>>>> ArrayLists to hold all of the words that we get from the imported tweets ArrayList stopWords = new ArrayList(); ArrayList cleanTweets = new ArrayList(); ArrayList words = new ArrayList(); ArrayList hashtags = new ArrayList(); ArrayList usernames = new ArrayList(); ArrayList urls = new ArrayList(); ArrayList tweetster = new ArrayList(); String uberWords [] = new String[0]; //massive array to build up history of words harvested String uberHashtags [] = new String[0]; //massive array to build up history of hashtags harvested String uberUsers [] = new String[0]; //massive array to build up history of users harvested String uberUrls [] = new String[0]; //massive array to build up history of urls harvested String queryString = ""; // String queryType = ""; // ArrayList fortFrags1 = new ArrayList(); ArrayList fortFrags2 = new ArrayList(); ArrayList fortFrags3 = new ArrayList(); ArrayList fortFrags4 = new ArrayList(); // <<<<<< Variables for admin and tweettexts - eg Array for containing imported admin settings from Google spreadsheet (init with default settings) String adminSettings [] = { "#hivemind", "@rosemarybeetle", "weird", "100", "50000", "h", "500", "Psychic Hive-Mind Fortune Reader", "Greetings Master. I am a-woken" }; String tweetTextIntro=""; String readingSettingText=""; int panelHeight = 60; int border = 40; int boxY = 515; int boxWidth = 270; int boxHeight = 40; int columnPos2_X = 310; // >>>>>> grabTweets Timer settings >>>>>>>>>>> float grabTime = millis(); float timeNow = millis(); String stamp = year()+"-"+month()+"-"+day()+"-"+hour()+"-"+minute();// <<<<<< Set up GUI interface-building library (ControlP5) // >>>>>> GUI library and settings import controlP5.*; // import the GUI library ControlP5 cp5; // creates a controller (I think!) ControlFont font; controlP5.Button b; controlP5.Textfield tf; controlP5.Textlabel lb; // <<<<<<< Set up text-to-speech library (GURU) // >>>>>>> import GURU text-to-speech library import guru.ttslib.*; // NB this also needs to be loaded (available from http://www.local-guru.net/projects/lib/ttslib-0.3.zip) TTS tts; // create an instance called 'tts' // <<<<<<< // >>>>>>> import standard processing Serial library import processing.serial.*; Serial port; // create an instance called 'port' // <<<<<<< // >>>>>> needed to stop Twitter overpolling from within sendTweet float tweetTimer = 5000; // wait period (in milliseconds) after sending a tweet, before you can send the next one float timerT=millis(); // temporary timer for sendTweet float delayCheck; //delayCheck; // THIS IS IMPORTANT. it i what stops overpollin g of the Twitter API // <<<<<< End of main initialisation Main SETUP() function... void setup() { tts = new TTS(); // create text to speech instance tts.speak(adminSettings[8]);// preloaded, not web println (" adminSettings 1 " + adminSettings); // @@ DEBUG STUFF for (int i = 0 ; i < adminSettings.length; i++) { println("adminSettings["+i+"]= "+adminSettings[i]); // @@ DEBUG STUFF } updateDisplayVariables(); try { loadRemoteAdminSettings(); // loads Twitter search parameters from remote Google spreadsheet println ("adminSettings 2 "+adminSettings); tts.speak("I am connected to the web. Master.Your commands have been loaded into my brain"); // @@ DEBUG STUFF - SPOKEN OUT. ONLY WORKS IF CONNECTION WORKS } catch (Exception e) { tts.speak("I am sorry. I am not able to connect to the web. Your commands have not been loaded into my brain master"); // @@ DEBUG STUFF } loadRemoteStopWords();// load list of stop words into an array, loaded from a remote spreadsheet // >>>>>>> screen size and settings.... size(screen.width-border, screen.height-border);// USE THIS SETTING FOR EXPORTED APPLICATION IN FULLSCREEN (PRESENT) MODE background(0); // SET BACKGROUND TO BLACK // <<<<<<< // >>>>> Make initial serial port connection handshake println(Serial.list());// // @@ DEBUG STUFF - display communication ports (use this in test for available ports) try { port = new Serial(this, Serial.list()[0], 115200); // OPEN PORT TO ARDUINO } catch (ArrayIndexOutOfBoundsException ae) { // if errors println ("-------------------------"); println ("STOP - No PORT CONNECTION"); println ("Exception = "+ae); // print it println ("-------------------------"); println ("-------------------------"); } // <<<<<<< buildAdminPanel(); smooth(); grabTweets(); // Now call tweeting action functions... println ("finished grabbing tweets"); println (); println (); } // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< end of setup() <<<<<<<<<<<<<<<<<<<<<<<<<< Main LOOP() function void draw() { int panelTop= height-panelHeight; buttonCheck("HELLO"); // on screen check button every loop timeNow=millis(); try { println (); if ((timeNow-grabTime)>float(adminSettings[4])) { grabTweets(); } // >>>>>> Draw a faint black rectangle over what is currently on the stage so it fades over time. fill(0, 30); // change the latter number to make the fade deeper (from 1 to 20 is good) rect(0, 0, width, height-panelHeight); // <<<<<< // >>>>>>> WORDS // Draw a word from the list of words that we've built int i = (int (random (words.size()))); String word = words.get(i); println ("word = "+word+" #"+i); // <<<<<<< // >>>>>>> HASHTAGS //Draw a hashtag from the list of words that we've built int j = (int (random (hashtags.size()))); String hashtag = hashtags.get(j); // <<<<<<< // >>>>>> USERNAMES //Draw a username from the list of words that we've built int k = (int (random (usernames.size()))); String username = usernames.get(k); // <<<<<< // >>>>>> URLS //Draw a url from the list of words that we've built int l = (int (random (urls.size()))); String url = urls.get(l); // <<<<<< //------------- // >>>>> Put url somewhere random on the stage, with a random size and colour fill(255, 255, 0, 255); textSize(random(30, 40)); text(url, random(width)-widthRandomiser, random(panelTop)); // // <<< SEND URL TO THE SCREEN // >>> SENDs HASHTAG TO THE SCREEN WITH DIFFERENT SIZE fill(255, 0, 0, 255); textSize(random(40, 45)); text("#"+hashtag, random(width)-widthRandomiser, random (panelTop)); // <<< END SEND HASHTAG# // >>>SEND WORD TO SCREEN ALSO WITH DIFFERENT SETTINGS textSize(random(45, 60)); fill(255, 255); text(word, random(width)-widthRandomiser, random (panelTop)); // <<< END SEND WORD // >>> SEND USERNAME TO SCREEN fill(0, 255, 22, 255); textSize(random(35, 45)); text("@"+username, random(width)-widthRandomiser, random (panelTop)); // <<< END SEND USERNAME // -------------- // following is for text boxes background. tfUserCurrent=tf.getText() ; //check the text box content every loop println ("tfUserCurrent= "+tfUserCurrent); // @@ DEBUG STUFF } catch (Exception e) { } finally { println ("inside DRAW()"); } checkSerial() ; // check serial port every loop } Function SENDTWEET() - sends tweets! // >>>>>>>>>>>>>>>>>>>>>>>> SEND THAT TWEET >>>>>>>>>>>>>>> void sendTweet (String tweetText) { if ((tfUserCurrent.equals(""))!=true) { // THE BOX CAN'T BE EMPTY updateDisplayVariables(); //@@@ timerT=millis(); // reset the timer each time if (timerT-delayCheck>=tweetTimer) // this is needed to prevent sending multiple times rapidly to Twitter // which will be frowned upon! { delayCheck=millis(); // RESET A TIMER println("tweet being sent"); // @@ DEBUG STUFF println("tfUserCurrent = "+ tfUserCurrent); // @@ DEBUG STUFF tweetTextIntro = readingSettingText; // INITIALISE THE INTRO TEXT VARIABLE... readFortune(tweetText); tts.speak(fortuneSpoken); println("tweet Send actions complete over"); // @@ DEBUG STUFF println(); //@@@ ConfigurationBuilder cb2 = new ConfigurationBuilder(); // ------- NB - the variables twitOAuthConsumerKey, are in a seperate tab cb2.setOAuthConsumerKey(twitOAuthConsumerKey); cb2.setOAuthConsumerSecret(twitOAuthConsumerSecret); cb2.setOAuthAccessToken(twitOAuthAccessToken); cb2.setOAuthAccessTokenSecret(twitOAuthAccessTokenSecret); Twitter twitter2 = new TwitterFactory(cb2.build()).getInstance(); try { Status status = twitter2.updateStatus(fortune); println("Successfully tweeted the message: "+fortune + " to user: [@" + status.getText() + "]."); // @@ DEBUG STUFF delayCheck=millis(); } catch(TwitterException e) { println("Send tweet: " + e + " Status code: " + e.getStatusCode()); } // end try ; } } else { tts.speak("You have not entered your Twitter user nayme. Sorry. I cannot reed your fortune. without this") ; // THE BOX WAS EMPTY } } // <<<<<<<<<<<<<<<<<<<<<<<<< END SEND TWEETS <<<<<<<<<<<<<<< Function GRABTWEETS() - this is the main harvesting function // >>>>>>>>>>>>>>>>>>>>>>>>> GRAB THOSE TWEETS >>>>>>>>>>>>> void grabTweets() { color cl3 = color(70, 130, 180); fill (cl3); rect(0, (height/2)-120, width, 90); fill(0, 25, 89, 255); textSize(70); text("Reading the collective mind...", (width/8)-120, (height/2)-50); // THE ALERT FOR UPDATE CHECKING PAUSE loadRemoteAdminSettings(); // GET THE LATEST ADMIN FROM GOOGLE SPREADSHEET //Credentials ConfigurationBuilder cbTest = new ConfigurationBuilder(); // ------- NB - the variables twitOAuthConsumerKey, etc. ARE IN A SEPARATE SHEET cbTest.setOAuthConsumerKey(twitOAuthConsumerKey); cbTest.setOAuthConsumerSecret(twitOAuthConsumerSecret); cbTest.setOAuthAccessToken(twitOAuthAccessToken); cbTest.setOAuthAccessTokenSecret(twitOAuthAccessTokenSecret); Twitter twitterTest = new TwitterFactory(cbTest.build()).getInstance(); try { // TRY ALLOWS ERROR HANDLING FOR EXCEPTIONS... Query query = new Query(queryString); // this is default you check the first of 4 admin settings, but should be extended to include passing a selctor param query.count(int(adminSettings[3])); // count is the number of tweets returned per page QueryResult result = twitterTest.search(query); // gets the query int ll=1; // @@ DEBUG STUFF for (Status status : result.getTweets()) { // EXTRACT THE TWEETS String user = status.getUser().getScreenName();// GET THE TWITTER USERNAME usernames.add(user); // ADD TO THE ARRAYLIST FOR USERNAMES String msg = status.getText(); // EXTRACT THE TWEET TEXT println ("tweet #"+ll); // @@ DEBUG STUFF println("@" + user); // @@ DEBUG STUFF println("Text of tweet=" + status.getText()); // @@ DEBUG STUFF println ("-----------"); ll++; // @@ DEBUG STUFF (INCREMENT) //Break the tweet into words String[] input = msg.split(" "); // BREAK DOWN THE TWEET USING SPACES AS A DELIMITER for (int j = 0; j < input.length; j++) { cleanTweets.add(input[j]); // CLEANTWEETS IS A STORE FOR TWEET WORDS WITH STOP WORDS REMOVED for (int ii = 0 ; ii < stopWords.size(); ii++) { if (stopWords.get(ii).equals(input[j])) { cleanTweets.remove(input[j]); // THIS WORD IS A STOP WORD - REMOVE IT! println("Word removed due to matched stopword: "+input[j]); // @@ DEBUG STUFF } // end if } //end for (ii++) //stopword c }// end clean this msg }// end of all tweet cleaning println ("cleanTweets = "+cleanTweets); for (int k = 0; k < cleanTweets.size(); k++) { if ((cleanTweets.get(k).equals(queryString))!= true) { println ("(cleanTweets.get(k) <"+cleanTweets.get(k)+".equals(queryString))"+queryString+"!= true"); words.add(cleanTweets.get(k)); if (words.size() >int(adminSettings[6])) { words.remove(0); } // keeps aray to a finite length by dropping off first element as new one is added // >>>>>> make the list of hashtags String hashtag= cleanTweets.get(k); String hashtagArray[] = hashtag.split("#"); if (hashtagArray.length>1) { //println ("inside checker"); hashtags.add(hashtagArray[1]); int v=words.size()-1; words.remove(v); if (queryType.equals("hashtag")) { if (hashtagArray[1].equals("#"+queryString)) { hashtags.remove(hashtagArray[1]); } else if (hashtags.size() >int(adminSettings[6])/10) { hashtags.remove(0); } // keeps aray to a finite length by dropping off first element as new one is added } println ("hashtagArray["+k+"]= "+hashtagArray[1]); } // <<<<<<< // >>>>>>> set up list of usernames String username= cleanTweets.get(k); String usernameArray[] = username.split("@"); // println ("usernameArray = "); //println (usernameArray); if (usernameArray.length>1) { int vv=words.size()-1; // takes out the username by removing last entry in words() words.remove(vv);// // println ("usernameArray["+j+"]= "+usernameArray[1]); } if (usernames.size() >int(adminSettings[6])/6) { usernames.remove(0); } // keeps aray to a finite length by dropping off first element as new one is added // <<<<<<<< // >>>>>>>> set up urls >>>>>> String url = cleanTweets.get(k); String urlArray[] = url.split("h"); if (urlArray.length>1) { String urlArray2[] = urlArray[1].split("t"); if (urlArray2.length>2) { urls.add(url); int vvv=words.size()-1; words.remove(vvv); } else if (urls.size() >int(adminSettings[6])/6) { urls.remove(0); } // keeps aray to a finite length by dropping off first element as new one is added // <<<<<<<<<< end // >>>>>>>>>> } }; } println ("WORDS.SIZE () = "+words.size()); println ("words = "+words); println ("@@@@@@@@@@@@@@@@@@@@@@@"); // >>>>>>> create text log file of words from pyschic scanning >>>>>>>>> for (int p =0;p { uberWords = append (uberWords, words.get(p).toString()); } uberWords = append (uberWords, "WORDS UPDATE REFRESH COMPLETED"); uberWords = append (uberWords, " "); saveStrings ("words-"+stamp+".txt", uberWords); // <<<<<< end word text log file // >>>>>> create log file of users for (int jj =0;jj { uberUsers = append (uberUsers, "@"+usernames.get(jj).toString()); } saveStrings ("users-"+stamp+".txt", uberUsers); // <<<<<<<<< end user text log file // >>>>>> create log file of hashtags for (int jj =0;jj { uberHashtags = append (uberHashtags, "#"+hashtags.get(jj).toString()); } saveStrings ("hashtags-"+stamp+".txt", uberHashtags); // <<<<<<<<< end hashtag text log file // >>>>>> create log file of urls for (int jj =0;jj { uberUrls = append (uberUrls, urls.get(jj).toString()); } saveStrings ("urls-"+stamp+".txt", uberUrls); // <<<<<<<<< end url text log file } //end try ?? catch(TwitterException e) { println("TEST query tweet: " + e + " Status code: " + e.getStatusCode()); } // end try/catch grabTime=millis(); // reset grabTime if (loadSettingsFirstLoadFlag==true) { loadSettingsFirstLoadFlag =false; // //this is the line that will cause subsequqnt updates to remove the first word(0) } cleanTweets.clear(); tweetster.clear(); } // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< end grabTweets() <<<<<<<< Function BUTTONCHECK() - checking for interaction void buttonCheck(String tweetTextIntro) { if (b.isPressed()) { println("button being pressed"); sendTweet ("digital (onscreen) Button MOUSE"); b.setWidth(50); // action for onscreen button press } } // <<<<<<<<<<<<<<<<<<<<<<< end of BUTTONCHECK // >>>>>>>>>>>>>>> check the open serial port >>>>>>>>>> Function CHECKSERIAL() - checks for data from Arduino void checkSerial() { println (); //println ("inside checkSerial()"); try { // >>>>>> see if the port is sending you stuff while (port.available () > 0) { String inByte = port.readString(); println ("Safe from OUSIDE IF . inByte = "+inByte); int w=int(random(150)); b.setWidth(w); println (); port.clear(); sendTweet ("physical Button"); } } // end try catch (Exception e) { println ("Check serial exception = "+e); } } // <<<<<<<<<<<<<<<<<<<<< end checkSerial <<<<<<<<<<<<<<<<<<<<< // >>>>>>>>>>>>>>>>>>> load remote admin settings >>>>>>>>>>>>>> Function LOADREMOTESETTINGS() - pulls control data from Google spreadsheetsdata void loadRemoteAdminSettings () { try { String checkRandomSpeech = adminSettings[8]; adminSettings = loadStrings("https://docs.google.com/spreadsheet/pub?key=0AgTXh43j7oFVdFNOcGtMaXZnS3IwdTJacllUT1hLQUE&output=txt"); if ((checkRandomSpeech.equals(adminSettings[8]))!=true) { tts.speak(adminSettings[8]); } for (int i = 0 ; i < adminSettings.length; i++) { println("adminSettings["+i+"]= "+adminSettings[i]); } // end for if (adminSettings[5].equals("h")) { println ("use hashtag for search"); queryString = adminSettings[0]; queryType = "hashtag"; } if (adminSettings[5].equals("u")) { println ("use username phrase for search"); queryString = adminSettings[1]; queryType = "username"; } if (adminSettings[5].equals("s")) { println ("use search term for search"); queryString = adminSettings[2]; queryType = "search term"; } updateDisplayVariables(); // now load load fortune fragments String frag1 []= loadStrings ("https://docs.google.com/spreadsheet/pub?key=0AgTXh43j7oFVdDQ3cUZ5Y2RMTm9RSXNrdElZTjN5R1E&output=txt"); for (int ff1=0; ff1 { fortFrags1.add(frag1[ff1]); println ("Fortune Frag1 = "+fortFrags1.get(ff1)); } String frag2 []= loadStrings ("https://docs.google.com/spreadsheet/pub?key=0AgTXh43j7oFVdGFQLTFhMUVqTTlkTjlRVUN4c3JtOGc&output=txt"); for (int ff2=0; ff2 { fortFrags2.add(frag2[ff2]); println ("Fortune Frag2 = "+frag2[ff2]); println ("Fortune Frag1 = "+fortFrags2.get(ff2)); } String frag3 []= loadStrings ("https://docs.google.com/spreadsheet/pub?key=0AgTXh43j7oFVdFE0Qm1yYmhyYWJETVJsSHJIOGFMQ3c&output=txt"); for (int ff3=0; ff3 { fortFrags3.add(frag3[ff3]); println ("Fortune Frag3 = "+frag3[ff3]); } String frag4 []= loadStrings ("https://docs.google.com/spreadsheet/pub?key=0AgTXh43j7oFVdG9KTnhLS2Zvbk5HNXp2RmRpeUZtTUE&output=txt"); for (int ff4=0; ff4 { fortFrags4.add(frag4[ff4]); println ("Fortune Frag4 = "+frag4[ff4]); } // end if } catch (Exception e) { println ("no CONNECTION"); } } // >>>> LOADREMOTESTOPWORDS() - imports the stopword filter list void loadRemoteStopWords () { try { String stopWordsLoader [] = loadStrings("https://docs.google.com/spreadsheet/pub?key=0AgTXh43j7oFVdFByYk41am9jRnRkeU9LWnhjZFJTOEE&output=txt"); if (loadstopWordsCheckInt==true) { for (int i = 0 ; i < stopWordsLoader.length; i++) { //stop stopWords.add(stopWordsLoader[i]); println("stopWords["+i+"]= "+stopWords.get(i)+". Length now: "+stopWords.size()); } loadstopWordsCheckInt=false; } } catch (Exception e) { println("jjjjjjjjjjjjj"); } } Function KEYRELEASED() - makes keyboard "enter/return" press fire tweet (testing only) void keyReleased() { if (key==TAB) { println ("Tab key released"); //tfToggleFocus(valFocus); } else if ((key==ENTER )|(key == RETURN)) { sendTweet("pressed return"); } } Function TFTOGGLEFOCUS - Ignore this. used for testing void tfToggleFocus (int val) { /*if (val==0) { tf.setFocus(true); tf.setColorBackground(focusBackgroundColor); tf.setColor(focusColor); valFocus=1; } else if (val==1) { tf.setFocus(false); tf.setColorBackground(focusOffBackgroundColor); tf.setColor(focusOffColor); valFocus=0; }*/ tf.setFocus(true); tf.setColorBackground(focusBackgroundColor); tf.setColor(focusColor); } Function UPDATEDISPLAYVARIABLES() - updates variables with admin settings... void updateDisplayVariables() { // Reading the mind queryString String currentHashtag = adminSettings [0]; String displayHashtag = "hashtag = "+adminSettings [0]+" "; if (adminSettings[0]=="") { displayHashtag=""; } String currentUserName = adminSettings [1]; String displayUserName = "@username = "+adminSettings [1]+" "; if (adminSettings[1]=="") { displayUserName=""; } String currentSearchTerms = adminSettings [2]; String displaySearchTerms = "search = "+adminSettings [2]; if (adminSettings[2]=="") { displayUserName=""; } readingSettingText = "Reading the hive mind for "+queryType+"= "+ queryString; color cl = color(70, 30, 180);// not in use color cl2 = color(70, 230, 180);//not in use fill (clPanel); //rect(30, boxY+15, width, 105); fill(0, 0, 0, 255); textSize(40); //text(readingSettingText, 10, boxY+40); //rect(0, boxY+13, width, 1); textSize(40); text("@", 2, boxY+33); fill (clPanel); rect(columnPos2_X, boxY-10, width, 50); fill(0, 0, 0, 255); textSize(35); //text(adminSettings[7], columnPos2_X+30, boxY-25); text(" //displayHashtag+displayUserName+displaySearchTerms; } Function BUILDADMINPANEL() - create the form interface void buildAdminPanel() { int panelTop = height-panelHeight; fill (clPanel); rect(0, panelTop, width, panelHeight); // >>>>>>> set up fonts //PFont font = createFont("arial",20); font = new ControlFont(createFont("arial", 100), 40); // <<<<<<< // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> set up GUI elements >>>>>>>>>>>>>>>>>>>> noStroke(); cp5 = new ControlP5(this); // adds in a control instance to add buttons and text field to noStroke(); tf = cp5.addTextfield(""); tf.setPosition(border, boxY); tf.setSize(boxWidth, boxHeight); tf.setColorBackground(focusBackgroundColor); tf.setColor(focusColor); tf.setFont(font); tf.setFocus(true); //tf.setAutoClear(true); tf.captionLabel().setControlFont(font); // @@@ // create a new button with name 'Tell my Fortune' b = cp5.addButton("but", 20, 100, 50, 80, 20); b.setId(2); // id to target this element b.setWidth(250); // width b.setHeight(25); b.setPosition(border, boxY+100); b.captionLabel().setControlFont(font); b.captionLabel().style().marginLeft = 1; b.captionLabel().style().marginTop = 1; b.setVisible(true); b.isOn(); b.setColorBackground(focusOffBackgroundColor); // @@@ // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< end of GUI <<<<<<<<<< // >>>>>>>> } Function READFORTUNE() - The biggie - this concocts the fortunes... void readFortune (String tweetText) { int picW1 = int(random (words.size())); String fortuneWord1= words.get(picW1); int picW2 = int(random (words.size())); String fortuneWord2= words.get(picW2); int hash = int(random (hashtags.size())); String fortuneHash= hashtags.get(hash); int urler = int(random (urls.size())); String fortuneUrl= urls.get(urler); int userer = int(random (usernames.size())); String fortuneUser = usernames.get(userer); int frag1Int =int (random (fortFrags1.size())); String fraglet1 = fortFrags1.get(frag1Int); int frag2Int =int (random (fortFrags2.size())); String fraglet2 = fortFrags2.get(frag2Int); int frag3Int =int (random (fortFrags3.size())); String fraglet3 = fortFrags3.get(frag3Int); int frag4Int =int (random (fortFrags4.size())); String fraglet4 = fortFrags4.get(frag4Int); fortune = "Psychic summary for @"+tfUserCurrent + ". for: #"+queryString+". "+ fortuneWord1+", "+ fortuneWord2+", #"+fortuneHash+ ", @"+fortuneUser+", "+fortuneUrl+". Enjoy/RT"; println ("just before fortune spoken"); fortuneSpoken = "Hello. "+tfUserCurrent+". "+adminSettings[7]+ ". "+fortuneGreeting +". Here. you are. Your Psychic Hive Mind. Fortune. based on reading .the collective mind of. "+queryString+". is. "+fraglet1+". "+ fortuneWord1+". "+ fraglet2+". "+fortuneWord2+". "+fraglet3+". hashtag."+fortuneHash+ ". "+fraglet4+". Twitter user."+fortuneUser+". Thank you. I have tweeted a psychic summary of this reading to your twitter account. Moove along now. " ; println ("fortuneSpoken= "+fortuneSpoken); } Step 12: The Psychic Fortune Teller reading and its tweet summary - test example This is recording of a pre-conference test fortune reading. It gives a pretty good idead of what the Psychic Fortune Teller readings sound like. It a test of the randomising fortune teller logic of the Psychic Hive-Mind Fortune Teller automaton. This was ecorded in early May 2013, just prior to taking to MuseumNext in Amsterdam, a European museum technology conference ( museumnext.org ) The psychic mind-reading is being generated from a search of the live twitter data with an API call for search term "museumnext" http://search.twitter.com/search.json?q=%23museumnext The subtitles show what it is speaking. The words in red are being harvested from Tweets in real time. The rest of the words, shown in black, are pre-scripted, but randomised text from the logic engine. The full text of the tweet is: " Hello rosemarybeetle. I hope you are very well and thank you for stopping by. I have stared deep into the hive mind. Here you are. Your psychic hive mind fortune, based on reading the collective mind of museumnext is: It could be that city and no's . There perhaps are #amsterdam . Find out more about the work done by twitter user @javiercelaya Danke. I have tweeted a psychic summary of this reading to you twitter account. Move along now " This spoken fortune includes two random terms ( city and Nos) a hashtag ( #amsterdam ) and a user name @javiercelaya The psychic brain is actually a Twitter app. The account used to register the Twitter app (Rosemarybeetle Labs) also sends a tweet summary with the two random terms, hashtag and username, but also a random URL from the discussion. Although they tweet well, URLs are not included in the full spoken fortune reading, because generally URLs are unintelligible when spoken by text-to-speech engines! The URL it picked at random was an Arts and Health South West website news item. Rather superbly this was about research into participation in museums and the arts and the findings that "visiting museums is positively associated with higher levels of happiness” This is a lovely example the psychic Fortune Teller demonstrating the the power of social discovery, that randomised connections make (if in a rather weird way!!)Step 13: Further information, references, credits, etc. Acknowledgments As ever, this is built on the open shared skills of others - respect! Twitter4j - Processing library for connecting to Twitter Yusuke Yamamoto (and others I believe?) Twitter4j is a java library that does the connection and transaction handling between Processing and Twitter. This is what enables simple connection to harvest the tweet content, and to send tweets, both from withing the Processign brain. EINDRUCKSVOLL. github.com/yusuke/twitter4j/network GURU - text-to-speech library for Processing Nikolaus Gradwohl The GURU text to speech library for Processing, is a key bit of code. It is what allows the Psychic Fortune Teller to talk to you. www.local-guru.net/blog/pages/ttslib ControlP5 - interface-building library for Processing Andreas Schlegel ControlP5 is a Processing library used to handle creation and control of user interfaces in the Processing draw() window. It's used for the twitter username entry box www.sojamo.de/libraries/controlP5/ Visualisation - Processing sketch for graphically display text list files JER THORP The visualisation of words on screen is based on an example sketch by Jer. blog.blprnt.com/blog/blprnt/updated-quick-tutorial-processing-twitter Keyboard hacking RANDY SARAFAN (Randolfo) The keyboard hacking started by reading this explanation of how he hacked open a keyboard to use the keys as inputs - super clear Instructable. instructables.com/id/Hacking-a-USB-Keyboard/ MuseumNext Conference appearance Thanks to JIM RICHARDSON and JASPER VISSER for agreeing to see what could be hacked together as an exhibition piece for the MuseumNext conference. The Psychic Fortune Teller debuted there in Amsterdam in May 2013. museumnext.org/ More information on my Making Weird Stuff blog Much of this Instructable first appeared on my blog Making Weird Stuff as it was being developed. There is some extra stuff not included here too... Tag cloud of data terms used This post shows a breakdown of terms used at the conference MuseumNext 2013. makingweirdstuff.blogspot.co.uk/2013/05/what-psychic-fortune-teller-read-from.html Original concept idea in a post in March 2013 This post is amusing to see how far the concept developed. More detailed post on text-to-speech using guru library and Google spreadsheet A more detailed post on this. Previous Instructables Twitr_janus Twitr_janus is a previous project from which some of the Psychic Fortune Teller tech was developed. It is a web-controlled data-driven puppet. instructables.com/id/How-to-make-a-remote-control-sentient-web-puppet-b/$(function() {$("a.lightbox").lightBox();});

    Seiten: