SetAngle
authorThomas Pietrzak <thomas.pietrzak@gmail.com>
Wed, 2 Mar 2022 08:13:02 +0000 (09:13 +0100)
committerThomas Pietrzak <thomas.pietrzak@gmail.com>
Wed, 2 Mar 2022 08:13:02 +0000 (09:13 +0100)
Arduino/TactonPlayer/TactonManager.cpp
Arduino/TactonPlayer/TactonManager.h
Arduino/TactonPlayer/TactonPlayer.cpp
Arduino/TactonPlayer/TactonPlayer.h
Arduino/TactonPlayer/TactonPlayerPreciseNew.cpp
Arduino/TactonPlayer/TactonPlayerPreciseNew.h

index ddc9717fa625ee89bdc1f63c10f7c4c05b4e98ba..92e0706d63df4a49f1d6f6af13f8672d752591cb 100644 (file)
@@ -130,3 +130,32 @@ void TactonManager::stop()
 {\r
        _player->stop();\r
 }\r
+\r
+void TactonManager::setAngle(unsigned int angle)\r
+{\r
+       _player->setAngle(angle);\r
+}\r
+\r
+void TactonManager::setAngleSequence(unsigned int nbangles, unsigned int frameduration, unsigned int nbframes, byte *angles)\r
+{/*\r
+       Serial.print("Nb angles ");\r
+       Serial.println(nbangles);\r
+       Serial.print("Frame duration ");\r
+       Serial.println(frameduration);\r
+       Serial.print("Nb frames ");\r
+       Serial.println(nbframes);*/\r
+       \r
+       unsigned int a[nbangles];\r
+       for (int i = 0 ; i < nbangles ; i++)\r
+               a[i] = (angles[2 * i] << 8) |angles[2 * i + 1];\r
+       \r
+       for (int i = 0 ; i < nbframes ; i++)\r
+       {\r
+               setAngle(a[i % nbangles]);\r
+/*     Serial.print("Angle ");\r
+       Serial.println(a[i % nbangles]);*/\r
+               // /!\ don't forget to multiply if the timer was changed in TactonPlayer\r
+               delay(64 * frameduration);\r
+       }\r
+       _player->clear();\r
+}\r
index e2e83b8cd7565de1b34271b57e074f1546f8423d..c687c070801736fda736b9cb00b5fe43d375044b 100644 (file)
@@ -26,6 +26,9 @@ class TactonManager
                void setAmplitudes(unsigned int nbf, byte *desc);\r
                void setFrequency(unsigned int freq);\r
                void stop();\r
+               //angle in degrees made with 4 vibrators\r
+               void setAngle(unsigned int angle);\r
+               void setAngleSequence(unsigned int nbangles, unsigned int frameduration, unsigned int nbframes, byte *angles);\r
 \r
 \r
                void clear();\r
index 84710618ec9d7e60fecfa1954758f97e4fddd151..aba614559e79c97ad2ff1bd306297f50d2b418a6 100644 (file)
@@ -12,4 +12,11 @@ TactonPlayer::TactonPlayer(byte nbtactors, byte *pins)
        }       \r
 }\r
 \r
+void TactonPlayer::clear()\r
+{\r
+       for (int i = 0 ; i < _nbtactors ; i++)\r
+               digitalWrite(_pins[i], LOW);\r
+}\r
+\r
+\r
 void __cxa_pure_virtual(void) {};
\ No newline at end of file
index 3294fb6ad5a6010dea208277c5629c0a35f6ff8c..e20f02a31a1c745468760903cbda16bfc4381ebc 100644 (file)
@@ -6,6 +6,11 @@
 //if using more than 8, change type of pattern\r
 #define MAXTACTORS 8\r
 \r
+#define TACTOR_RIGHT   0\r
+#define TACTOR_UP              1\r
+#define TACTOR_LEFT            2\r
+#define TACTOR_DOWN            3\r
+\r
 extern "C" void __cxa_pure_virtual(void); \r
 \r
 class TactonPlayer \r
@@ -19,10 +24,14 @@ class TactonPlayer
                //set a different amplitude for each vibrator\r
                virtual void setAmplitudes(byte nbtactors, byte amplitudes[]) = 0;\r
 //             virtual void setPattern(byte pattern) { _pattern = pattern; }\r
+               virtual void setAngle(unsigned int angle) = 0;\r
 \r
 \r
                //Stop any vibration\r
                virtual void stop() = 0;\r
+               \r
+               //Clear the pattern, the frequency remains\r
+               virtual void clear();\r
 \r
                //8bits pattern => max 8 tactors, change type if using more\r
                virtual void beep(byte pattern, unsigned long duration, unsigned int frequency, byte amplitude) = 0;\r
index 9918eabd68096099ec518c048857d48bde675b6c..6b6f32e76c3aeee12c6b8d544071d61ad801bcb1 100644 (file)
@@ -21,8 +21,12 @@ void TactonPlayerPreciseNew::init() const
        \r
        //set prescalar for timer0 and timer2 to 1\r
        // /!\ this affects delay!\r
+       TCCR0B |= (1 << CS00);\r
        TCCR0B &= ~(1 << CS01);\r
+       TCCR0B &= ~(1 << CS02);\r
+       TCCR2B |= (1 << CS20);\r
        TCCR2B &= ~(1 << CS21);\r
+       TCCR2B &= ~(1 << CS22);\r
 }\r
 \r
 void TactonPlayerPreciseNew::setFrequency(unsigned int frequency)\r
@@ -64,6 +68,34 @@ void TactonPlayerPreciseNew::setAmplitudes(byte nbtactors, byte *amplitudes)
                analogWrite(_pins[i], amplitudes[i]);\r
 }\r
 \r
+void TactonPlayerPreciseNew::setAngle(unsigned int angle)\r
+{\r
+       //vertical\r
+       if (angle < 180)\r
+       {\r
+               analogWrite(_pins[TACTOR_UP], 255 * sin(angle * M_PI / 180.0));\r
+               analogWrite(_pins[TACTOR_DOWN], 0);\r
+       }\r
+       else\r
+       {\r
+               analogWrite(_pins[TACTOR_DOWN], - 255 * sin(angle * M_PI / 180.0));\r
+               analogWrite(_pins[TACTOR_UP], 0);\r
+       }\r
+\r
+       //horizontal\r
+       if (angle < 90 || angle > 270)\r
+       {\r
+               analogWrite(_pins[TACTOR_RIGHT], 255 * cos(angle * M_PI / 180.0));\r
+               analogWrite(_pins[TACTOR_LEFT], 0);\r
+       }\r
+       else\r
+       {\r
+               analogWrite(_pins[TACTOR_RIGHT], 0);\r
+               analogWrite(_pins[TACTOR_LEFT], - 255 * cos(angle * M_PI / 180.0));\r
+       }\r
+}\r
+\r
+\r
 //Stop any vibration\r
 void TactonPlayerPreciseNew::stop()\r
 {\r
@@ -72,10 +104,9 @@ void TactonPlayerPreciseNew::stop()
        OCR1A = 0;\r
        OCR1B = 0;\r
        //clear the pattern\r
-       for (int i = 0 ; i < _nbtactors ; i++)\r
-               digitalWrite(_pins[i], LOW);\r
+       clear();        \r
 }\r
-\r
+       \r
 //Play a Tacton for a specified duration, frequency and amplitude\r
 void TactonPlayerPreciseNew::beep(byte pattern, unsigned long duration, unsigned int frequency, byte amplitude)\r
 {      
index 796b3c4325981d60d751b8d873e730fb3247ef9b..6b3acc8aec0f47856653f382b9c38bdc10ad4332 100644 (file)
@@ -13,6 +13,8 @@ class TactonPlayerPreciseNew: public TactonPlayer
                void setFrequency(unsigned int frequency);\r
                //sets a different amplitude for each vibrator\r
                void setAmplitudes(byte nbtactors, byte *amplitudes);\r
+               \r
+               void setAngle(unsigned int angle);\r
 \r
                //Stop any vibration\r
                void stop();\r