2014-07-23

Ne Olacak bu Okunmamış Radyoloji Filmlerinin hali?


Okunmamış radyoloji filmleri ülkemizde sorun olmaya devam ediyor ancak ilginç olan durum kimse sorunu sorun olarak algılamıyor. Ne demiş büyüklerimiz “Sorunları sorun etmezsen sorun olmaz”. Bende huy olarak sorunları sorun edenlerdenim. Yıllarca sorun olmamış bir koruyu niye sorun ediyorsun derlerse kendi bloğunda, kendi kendine konuşuyor dersiniz. Kimseye bir müdahale  etme niyeti, olasılığı yok.

2014 yılında Avustralya  Queensland Gold Coast hastanesinde 40.000’den fazla raporlanmamış radyografi bulunması hükümet organları tarafından soruşturma konusu olmuştur.  Bu hastanede röntgen filmler sadece incelemeyi talep eden hekim tarafından görülmüş, resmi olarak radyolojik raporlanma sürecinden geçmemiştir.

Radyoloji incelemelerine en baştan başlayalım.

Röntgen dahil tüm radyolojik incelemeler bir hekim tarafından gerekli görülme ile başlar. Buna tıp dilinde endikasyon diyoruz. Bundan sonra bu kelimeyi kullanacağız. Endikasyonlar neden gerekli? Radoyolojik incelemelerin zaman ve parasal maliyetleri bulunmaktadır. Parasal maliyeti sigortacı kurum veya hasta tarafından üstlenilmektedir. Zamansal maliyeti ise radyoloji departmanı  ve hastaya yüklenmektedir.
Radyolojik inceleme sonucu bir soruya yanıt aranmaktadır.  Örneğin “Batın içinde serbest hava var mı?” sorusu. Radyolojik inceleme sonrası evet, hayır ve bilemiyoruz gibi üç durum ile karşı karşıya olmalıyız. Bilemiyoruz yanıtı ancak filmler uzman bir hekim tarafından yeterli bir değerlendirmeden geçtiyse kabul edilebilir bir yanıttır.

Waste medical films 1310305 Nevit

Endikasyonlar, filmler ve yanıtlar kayıt altına alınmazsa radyolojik işlemlerden istenilen sonucun alındığını söylemek güç.  Ülkemizde (çoğu hastane ve klinikte) yaygın olan görüş düz röntgen veya radyografinin çekilmesi ve değerlendirilmesi angarya olduğu şeklindedir.  Bu kanı çokta yersiz değildir. Bu kanıyı haklı çıkaran sebeplerin başında endikasyon olmadan çekilen filmler gelmektedir.

Bir olasılıkta aslında incelemeyi başlatmaya gerekçe olabilecek geçerli bir endikasyon yok veya klinik sorunun cevabını bu inceleme ile vermek olası değil.  Soru olmayışını şu şekilde açabiliriz. Hekim klinik muayeneden sonra tanı konusunda kesine yakın bir yargıya ulaşmış durumda ise, hastayı  tedavi etmeye hazırdır, ancak hastanın “hiçbir tahlil yapmayacak mısınız” eleştirisinden çekindiğinden bazı tetkikler istemektedir. Öylesine yapılan incelemelerde benzer senaryoları genişletmek mümkün.

Soru var ama bunun yanıtı bu inceleme ile vermek olası değil. Hastanede tomografi yok ama neden yok yanıtını işletme değil hekim hastaya anlatmak zorunda. Tecrübe bu konuşmanın her zaman tatsız olduğunu gösteriyor. İşletmenin değişmeye niyeti yok. Hastanın da durumu riskli değil, bu durumda hiçbir şey yapmadılar dedirtmemek için “şunları yaptır gel” denilebiliyor bazı yerlerde.

Waste medical films 1330847 Nevit


Hastanelerin yönetimlerine YÖK, sağlık bakanlığı gibi üst kurum ve kurullar tarafından müdahale edilip, kadroları kısıtlandıkça hastaneler raporsuz radyolojik işlemleri daha benimser hale gelmişlerdir. Radyoloji uzmanı çalıştırmak ekstra bir maliyet getirmekte. Çoğu radyoloji departmanı röntgen teknisyenleri tarafından idare edilmekte. Başında sorumlu radyoloji uzmanı bulunmamaktadır. Anadolu’da onlarca yıl radyoloji uzmanı bulunmaksızın radyoloji hizmeti veren yüzlerce hastane bulabilirsiniz. Sağlık bakanlığına bağlı hastanelerde Radyoloji uzmanına ise röntgen filmini değerlendirme karşılığı 1TL altında bir döner sermaye uygun görülmektedir.  Ülkemizde kimse radyografilerin değerlendirilmesini istemiyor.
Radyoloji uzmanının radyoloji departmanındaki bazı görevleri şunlardır.

Cihazların uygun ve çalışır durumda olduğundan emin olmak.
Teknisyenlerin çekimi kurallarına uygun yapıp yapmadığını denetlemek, gerektiğinde teknisyen ve cihaz değişikliğine gitmek.
İncelemenin doğru bir endikasyon ile başladığından emin olmak.
İnceleme sonucunu inceleyip, raporlamak.

Ülkemizde yine yaşam ve iş ortamı gerçekleri pek çok durumda radyoloji uzmanın bu görevleri yapmasına elverişli değildir.

Pek çok karar radyoloji uzmanı haberi dışında hatta radyoloji uzmanı bulunmaksızın verilmektedir. Radyoloji uzmanı varsa bile ağırlığı CEO’lar ve işletme sahipleri açısından düşüktür.

Pek çok merkezde rutin şu şekilde işlemektedir. Hastayı muayene eden hekim radyolojik isteği yapar. İnceleme gerçekleşir. İncelemeyi isteyen hekim kendi zihninde bir kanaate varır. Bu kanaatini bazen bir dosyaya not düşer.

Öyle bir ülke düşününki senede onbinlerce film çekilsin ve bu filmlerin ciddi bir değerlendirmeden geçip geçmediği bilinmesin. Alabama’da 2009 yılında dava konusu olan bir vaka serisinde 900 röntgen 272’sinde ciddi bir hastalık bulunduğu ancak raporlama sürecinden geçmediğinden  kayda alınmadığı tespit edildi.
Radyolojik raporlar hastaların şimdiki zamanına ilişkin bilgiler içerdiği gibi, gelecekte hastanın geçmişine ilişkin bilgi isteyen kişilerin başvuru kaynağıdır.

Hasta açısından bakıldığından filmin çekilmesi sürecin sonudur. İncelemeyi talep eden hekim rapor talep etmedikçe hiçbir hastanın bağımsız radyolojik görüş talep ettiğine şahit olmadım.

Hastane yönetimi açısından bakıldığında radyoloji uzmanı çalıştırmak, ekstra maliyet getiren bir süreç. Yönetim maliyet düşürmek için raporlamayı istemeyebilir.  Bu daha  az Radyoloji uzmanı ile daha çok inceleme demektir.

Waste medical films 1310285 Nevit

İncelemeyi isteyen hekim kendini yetkin hissediyorsa radyolojik raporlamayı talep etmeyebilir.  İncelemeyi isteyen hekim radyolojik görüşün kendi görüşü ile çelişeceğini hissediyorsa radyolojik raporlamayı talep etmeyebilir.  İncelemeyi isteyen hekim zaman kazanmak için radyolojik raporlamayı talep etmeyebilir.
Radyoloji uzmanı aşırı yoğunluk nedeniyle radyolojik raporlamayı istemeyebilir.  Radyoloji uzmanı ülkemizdeki gibi düşük ücretler nedeniyle radyolojik raporlamayı istemeyebilir.

2013 yılında Dublin’de yaşanan bir skandal’da şüpheli ölümleri araştırmak üzere kurulmuş bir kurulun 57.000 raporlanmamış filme rastlaması ile ortaya çıktı.

2006 yılında Zachary James kuzey Philadelphia’da aort anevrizması patlaması sonucu hayatını kaybettiğinde istemi yapan hekimin radyolojik incelemeyi görmediğini, nöbeti devrettiği meslektaşının da radyografiyi görmediği ortaya çıkmıştı. Sonuç olarak mahkeme hasta yakınlarının 2.000.000$ üzerinde bir tazminat almayı hak ettiğine karar verdi.

Değerlendirilmemiş radyolojik incelemeleri sadece radyolog, isteyen hekim veya hastane sorunu olarak görmemek gerekir. Kağıt üzerinde istatistikleri düzeltme amaçlı değerlendirmeler yaptırmak da sorunu çözmeyecektir.  Sorunu sorun etmezsek sorun kalmaz ama sorun etmek istiyorsak buna sağlığa yakışır bir ciddiyet ile bakmak gerekir.


Waste medical films 1340431 Nevit

Meme dansitesi nedir? Yoğun meme yapısına sahip ne demek?


Meme dansitesi nedir?

Meme dokusu, bağ dokusu, süt salgı bezleri  ve yağ dokusu karışımından oluşur.  Bağ dokusu ve süt salgılayan bezlerin yağa oranı yüksek ise meme dens veya yoğun olarak kabul edilir. Meme dansitesi yaş ile beraber düşmektedir.  Ancak kısa vadede çoğu kadında değişiklik göstermez.

Yoğun meme yapısına sahip olduğumu nerden anlayabilirim? 

Meme dansitesi  mamografinizi değerlendiren radyolog tarafından belirlenir. Mamografiyi inceleyen radyoloji uzmanı meme yapısının A/B/C/D  (1/2/3/4) kategorilerinden hangisine ait olduğuna görüntüde yağ oranına göre görsel olarak karar verir.

A-1: Tamama yakın yağ dokusundan oluşmaktadır (%75-100 )
B-2: Yama tarzında seyrek fibroglandüler doku  (%50-75)
C-3: Heterojen yoğun (%25-50)
D-4: İleri derecede yoğun (%0-25)

Meme dansitesi neden önemli?

Yoğun meme yapısına sahip olma meme kanserine yakalanma riskini arttırmaktadır. Ayrıca yoğun meme yapısı  mamografi filminde meme kanserini saptamayı zorlaştırmaktadır.  Yoğun meme alanları mamografi üzerinde açık renk gözükmekte, selim ve habis kitleler benzer şekilde mamografide açık renkte izlenmektedir. Bu örtüşmeden dolayı beyaz üzerinde beyaz bir yapıyı saptamak güçleşmektedir.

Yoğun meme yapısına sahipsem hala mamografi çektirmelimiyim?

Mamografi incelemesi meme kanserinin ölümü azalttığı gösterilmiş tek incelemedir.  Pek çok kanser yoğun meme dokusuna sahip olsanız bile mamografide izlenebilir. Bu yüzden yoğun meme yapısına sahip olsanız bile mamografi çektirmeniz önerilir. Ancak bu inceleme ultrason ve muayene ile desteklenmelidir.

Yoğun memelerde mamografiden daha iyi olan inceleme yöntemi var mıdır?

Ultrason ve manyetik rezonans görüntülemede mamografide izlenmeyen bazı kitlelerin saptanabildiğini  bilmekteyiz. Tarama amaçlı ultrason ve MR incelemelerin maliyeti sigorta kuruluşları tarafından karşılanmayabilir.

Meme yapım yoğun değil ise ne yapmalıyım?

Meme yapınız yoğun olmasa bile hekimlerin önerisi ile ilave incelemeler gerekebilir. Pozitif aile öyküsü göğüs bölmesine yapılmış olan ışın tedavisi gibi faktörler riskinizi arttırabilir. Düşük risk grubunda olsanız bile kendi kendine meme muayenesi ile tüm kitleleri saptamanız olanaklı değildir. Meme yapısının büyük olması ve memenin sert olması kendi kendine meme muayenesi duyarlılığını düşürmektedir.  40 yaşından sonra tedbir amaçlı düzenli  muayene ve görüntüleme önerilir.

2014-07-16

Yararlı mavi bir endikatör : Turnusol (Litmus)


Yararlı mavi bir endikatör: Turnusol (Litmus)

İlk deneylerimizde asitler, alkaliler gibi temel kavrakları öğreneceksiniz. Turnusol çözeltisi ve kağıdı kimyada kullanılan ayıraçlardan bir tanesidir.  Turnusol kağıdı, çözeltiyi bir filtre kağıdına emdirilip ve kurutularak yapılır. Turnusol tozunu duymadıysanız, ince koyu bir toz olarak düşünebilirsiniz. Turnusol veya Litmus tozu Rocella türü likenlerden elde ediliyor. Kuzukulağı diye bilinen Rocella montagnei ve Rocella tinctoria turnusol yapımında en çok kullanılan likenlerdir. Farklı ülkelerde farklı likenler yapım için kullanılabilmektedir. Turnusol içinde orsein ve erythrolitmindir gibi 15’e yakın boyar madde bulunmaktadır.

Tozdan turnusol yapmak için deney tüpünün dibini 1mm kadar kaplayacak kadar turnusol tozu konur. Üzeri 3 cm kadar distile su ile doldurulur.  Tüpün ağzı lastik tıpa ile kapatılıp uzunca bir süre çalkalanır. Çocukların ulaşılamayacağı bir yerde tortunun çökmesi için bir gün bekletilir. Çökeltiyi almadan üstteki sıvı kısım pipet ile kullanılacak şişeye alınır. Tortu çöpe atılır. Çözeltinin çabuk bozulmasını engellemek için ½ ml etil alkol ilavesi yapabilirsiniz.

Turnusol çözeltiler deki asit ve bazları ayırt etmekte kullanılır. Turnusol çözeltisi asit ortamlarda kırmızı, alkali ortamlarda maviye dönecektir.  Bu tür ayraçlara pH belirteci denir. Mavi turnusol kağıdı asidik ortamlarda kırmızıya ve kırmızı turnusol kağıdı bazik ortamlarda (Alkali) maviye döner. Renk değişimi oda sıcaklığında 4,5-8,3 pH aralığında menekşe tonlarında olur. Sadece asit ve bazlar değil, bazı çözünen tuzlar da turnusol kağıdını mavi veya kırmızıya dönüştürürler. Kuvvetli asit ve zayıf bazlardan oluşan tuzlar asidik, zayıf asit ve kuvvetli bir bazdan oluşan tuzlar bazik özellik gösterdiğinden turnusolü boyarlar.

Turnusol kağıdı ile bir gazın pH derecesini ölçmek için, turnusol kağıdını ıslatmak gerekir. Gaz suda çözünür ve bu sayede tepkime olur.

Asit baz dışında da tepkimeler vardır. Örneğin, klor gazı mavi turnusol kağıdını ağartıp beyaza döndürür.

2014-07-08

Arduino UNO + MPU-6050 Pitch - Roll Code for 2 Servo motors

The following code uses Arduino UNO alongside GY-521 breakout board with MPU-6050 Accelerometer and Gyroscope to control two servo motors. I couldn't find an alternative good code. Just managed to modify the below code from original Jeff Rowberg version to do the motion simulation task. Currently the two axis servo motors follow MPU-6050 breakout motions. To make a gimbal I think I would need to modify the code so that servo angles become "180-current" value. I tried this code a few minutes ago. Good news is that it is smooth and it does not jitter. I wonder if it can be made faster. I have some doubts whether if I can use this code as gimbal to stablize GoPro. Reaction time and mechanical power would be important in Gimbal setting usage. The code is dirty looking but it works fine. I will have to do some clean-up to get rid of unnecessary lines or do a complete rewrite. I just share it because I could not find a better code.

With a radio remote transmitter the sensor can be used as DIY camera head tracking for FPV cameras. You turn your head and camera would look at the direction you turned your head. You can find "Head Tracker FPV" - project's on Youtube but most would not say how they managed to do it.






// I2C device class (I2Cdev) demonstration Arduino sketch for MPU6050 class using DMP (MotionApps v2.0)
// 6/21/2012 by Jeff Rowberg <jeff@rowberg.net>
// Updates should (hopefully) always be available at https://github.com/jrowberg/i2cdevlib
//
// Changelog:
//      2013-07-08 - Nevit Dilmen Modified for use with 2 axis Roll-Pitch servos as X&Y angle changes
//                   http://nevit.blogspot.com.tr/search/label/MPU-6050
//                   It should be simpler hopefully. 
//      2013-05-08 - added seamless Fastwire support
//                 - added note about gyro calibration
//      2012-06-21 - added note about Arduino 1.0.1 + Leonardo compatibility error
//      2012-06-20 - improved FIFO overflow handling and simplified read process
//      2012-06-19 - completely rearranged DMP initialization code and simplification
//      2012-06-13 - pull gyro and accel data from FIFO packet instead of reading directly
//      2012-06-09 - fix broken FIFO read sequence and change interrupt detection to RISING
//      2012-06-05 - add gravity-compensated initial reference frame acceleration output
//                 - add 3D math helper file to DMP6 example sketch
//                 - add Euler output and Yaw/Pitch/Roll output formats
//      2012-06-04 - remove accel offset clearing for better results (thanks Sungon Lee)
//      2012-06-01 - fixed gyro sensitivity to be 2000 deg/sec instead of 250
//      2012-05-30 - basic DMP initialization working

/* ============================================
I2Cdev device library code is placed under the MIT license
Copyright (c) 2012 Jeff Rowberg

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
===============================================
*/

//Servo 
#include <Servo.h>

Servo myservoY; // Roll
Servo myservoX; // Pitch

// I2Cdev and MPU6050 must be installed as libraries, or else the .cpp/.h files
// for both classes must be in the include path of your project
#include "I2Cdev.h"

#include "MPU6050_6Axis_MotionApps20.h"
//#include "MPU6050.h" // not necessary if using MotionApps include file

// Arduino Wire library is required if I2Cdev I2CDEV_ARDUINO_WIRE implementation
// is used in I2Cdev.h
#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
    #include "Wire.h"
#endif

// class default I2C address is 0x68
// specific I2C addresses may be passed as a parameter here
// AD0 low = 0x68 (default for SparkFun breakout and InvenSense evaluation board)
// AD0 high = 0x69
MPU6050 mpu;
//MPU6050 mpu(0x69); // <-- use for AD0 high

/* =========================================================================
   NOTE: In addition to connection 3.3v, GND, SDA, and SCL, this sketch
   depends on the MPU-6050's INT pin being connected to the Arduino's
   external interrupt #0 pin. On the Arduino Uno and Mega 2560, this is
   digital I/O pin 2.
 * ========================================================================= */

/* =========================================================================
   NOTE: Arduino v1.0.1 with the Leonardo board generates a compile error
   when using Serial.write(buf, len). The Teapot output uses this method.
   The solution requires a modification to the Arduino USBAPI.h file, which
   is fortunately simple, but annoying. This will be fixed in the next IDE
   release. For more info, see these links:

   http://arduino.cc/forum/index.php/topic,109987.0.html
   http://code.google.com/p/arduino/issues/detail?id=958
 * ========================================================================= */



// uncomment "OUTPUT_READABLE_YAWPITCHROLL" if you want to see the yaw/
// pitch/roll angles (in degrees) calculated from the quaternions coming
// from the FIFO. Note this also requires gravity vector calculations.
// Also note that yaw/pitch/roll angles suffer from gimbal lock (for
// more info, see: http://en.wikipedia.org/wiki/Gimbal_lock)
#define OUTPUT_READABLE_YAWPITCHROLL

#define LED_PIN 13 // (Arduino is 13, Teensy is 11, Teensy++ is 6)
bool blinkState = false;

// MPU control/status vars
bool dmpReady = false;  // set true if DMP init was successful
uint8_t mpuIntStatus;   // holds actual interrupt status byte from MPU
uint8_t devStatus;      // return status after each device operation (0 = success, !0 = error)
uint16_t packetSize;    // expected DMP packet size (default is 42 bytes)
uint16_t fifoCount;     // count of all bytes currently in FIFO
uint8_t fifoBuffer[64]; // FIFO storage buffer

// orientation/motion vars
Quaternion q;           // [w, x, y, z]         quaternion container
VectorInt16 aa;         // [x, y, z]            accel sensor measurements
VectorInt16 aaReal;     // [x, y, z]            gravity-free accel sensor measurements
VectorInt16 aaWorld;    // [x, y, z]            world-frame accel sensor measurements
VectorFloat gravity;    // [x, y, z]            gravity vector
float euler[3];         // [psi, theta, phi]    Euler angle container
float ypr[3];           // [yaw, pitch, roll]   yaw/pitch/roll container and gravity vector

// packet structure for InvenSense teapot demo
uint8_t teapotPacket[14] = { '$', 0x02, 0,0, 0,0, 0,0, 0,0, 0x00, 0x00, '\r', '\n' };



// ================================================================
// ===               INTERRUPT DETECTION ROUTINE                ===
// ================================================================

volatile bool mpuInterrupt = false;     // indicates whether MPU interrupt pin has gone high
void dmpDataReady() {
    mpuInterrupt = true;
}



// ================================================================
// ===                      INITIAL SETUP                       ===
// ================================================================

void setup() {
    // join I2C bus (I2Cdev library doesn't do this automatically)
    #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
        Wire.begin();
        TWBR = 24; // 400kHz I2C clock (200kHz if CPU is 8MHz)
    #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE
        Fastwire::setup(400, true);
    #endif

//Attach servo

  myservoY.attach(9); // Attach Y servo to pin 9
  myservoX.attach(10);// Attach X servo to pin 10

    // initialize serial communication
    // (115200 chosen because it is required for Teapot Demo output, but it's
    // really up to you depending on your project)
    Serial.begin(115200);
    while (!Serial); // wait for Leonardo enumeration, others continue immediately

    // NOTE: 8MHz or slower host processors, like the Teensy @ 3.3v or Ardunio
    // Pro Mini running at 3.3v, cannot handle this baud rate reliably due to
    // the baud timing being too misaligned with processor ticks. You must use
    // 38400 or slower in these cases, or use some kind of external separate
    // crystal solution for the UART timer.

    // initialize device
    Serial.println(F("Initializing I2C devices..."));
    mpu.initialize();

    // verify connection
    Serial.println(F("Testing device connections..."));
    Serial.println(mpu.testConnection() ? F("MPU6050 connection successful") : F("MPU6050 connection failed"));
/*
    // wait for ready
    Serial.println(F("\nSend any character to begin DMP programming and demo: "));
    while (Serial.available() && Serial.read()); // empty buffer
    while (!Serial.available());                 // wait for data
    while (Serial.available() && Serial.read()); // empty buffer again
*/
    // load and configure the DMP
    Serial.println(F("Initializing DMP..."));
    devStatus = mpu.dmpInitialize();

    // supply your own gyro offsets here, scaled for min sensitivity
    mpu.setXGyroOffset(220);
    mpu.setYGyroOffset(76);
    mpu.setZGyroOffset(-85);
    mpu.setZAccelOffset(1788); // 1688 factory default for my test chip

    // make sure it worked (returns 0 if so)
    if (devStatus == 0) {
        // turn on the DMP, now that it's ready
        Serial.println(F("Enabling DMP..."));
        mpu.setDMPEnabled(true);

        // enable Arduino interrupt detection
        Serial.println(F("Enabling interrupt detection (Arduino external interrupt 0)..."));
        attachInterrupt(0, dmpDataReady, RISING);
        mpuIntStatus = mpu.getIntStatus();

        // set our DMP Ready flag so the main loop() function knows it's okay to use it
        Serial.println(F("DMP ready! Waiting for first interrupt..."));
        dmpReady = true;

        // get expected DMP packet size for later comparison
        packetSize = mpu.dmpGetFIFOPacketSize();
    } else {
        // ERROR!
        // 1 = initial memory load failed
        // 2 = DMP configuration updates failed
        // (if it's going to break, usually the code will be 1)
        Serial.print(F("DMP Initialization failed (code "));
        Serial.print(devStatus);
        Serial.println(F(")"));
    }

    // configure LED for output
    pinMode(LED_PIN, OUTPUT);
}



// ================================================================
// ===                    MAIN PROGRAM LOOP                     ===
// ================================================================

void loop() {
    // if programming failed, don't try to do anything
    if (!dmpReady) return;

    // wait for MPU interrupt or extra packet(s) available
    while (!mpuInterrupt && fifoCount < packetSize) {
        // other program behavior stuff here
        // .
        // .
        // .
        // if you are really paranoid you can frequently test in between other
        // stuff to see if mpuInterrupt is true, and if so, "break;" from the
        // while() loop to immediately process the MPU data
        // .
        // .
        // .
    }

    // reset interrupt flag and get INT_STATUS byte
    mpuInterrupt = false;
    mpuIntStatus = mpu.getIntStatus();

    // get current FIFO count
    fifoCount = mpu.getFIFOCount();

    // check for overflow (this should never happen unless our code is too inefficient)
    if ((mpuIntStatus & 0x10) || fifoCount == 1024) {
        // reset so we can continue cleanly
        mpu.resetFIFO();
        Serial.println(F("FIFO overflow!"));

    // otherwise, check for DMP data ready interrupt (this should happen frequently)
    } else if (mpuIntStatus & 0x02) {
        // wait for correct available data length, should be a VERY short wait
        while (fifoCount < packetSize) fifoCount = mpu.getFIFOCount();

        // read a packet from FIFO
        mpu.getFIFOBytes(fifoBuffer, packetSize);
        
        // track FIFO count here in case there is > 1 packet available
        // (this lets us immediately read more without waiting for an interrupt)
        fifoCount -= packetSize;

        #ifdef OUTPUT_READABLE_YAWPITCHROLL
            // display Euler angles in degrees
            mpu.dmpGetQuaternion(&q, fifoBuffer);
            mpu.dmpGetGravity(&gravity, &q);
            mpu.dmpGetYawPitchRoll(ypr, &q, &gravity);
            Serial.print("ypr\t");
            Serial.print(ypr[0] * 180/M_PI);
            Serial.print("\t");
            Serial.print(ypr[1] * 180/M_PI);
            myservoY.write(int(ypr[1] * -180/M_PI)+90);   // Rotation around Y
            Serial.print("\t");
            Serial.println(ypr[2] * 180/M_PI);
            myservoX.write(int(ypr[2] * 180/M_PI)+90);   // Rotation around X
        #endif


        // blink LED to indicate activity
        blinkState = !blinkState;
        digitalWrite(LED_PIN, blinkState);
    }
    
}











GY521 Arduino connections
--------------------------

  • VCC 3.3v or 5v depending on your GY-521
  • GND Ground
  • SCL A5
  • SDA A4
  • INT D2
  • Servo X D9
  • Servo Y D10
I2C and MPU-6050 libraries should be downloaded and placed according to directions given in the site below: http://www.i2cdevlib.com/devices/mpu6050



2014-07-02

Arduino, bozuk SD kart

Arduino SD kart ile maceralarım bugün de devam etti. Aslında kolay. Bir kaç şeyi beceremedim ve akibetülhüsran oldu. Kablo bağlantıları içindeki kütüphane bilgisine göre yapılınca kartı gördü. Yanlız sanırım kartta bir temassızlık var. Kart test programını çalıştırdığımda 4 hep bağlantı tamam diyor. Ama 2-3 kez kart tamam diyorsa, 4-5 kez kart yok, formatsız vs gibi karta ilişkin hatalar veriyor. Kartlar bildiğim, kullandığım kartlar. Voltaj değiştirmeyi denedim. Bazen 3.3 » 3.3'e bağladım, bazen 5'i 5'e. Farkeden bir şey olmadı. Sanırım çin malı SD kart temas noktalarında veya devre elemanlarında bir sorun var.

Gördüğüm hatalar:
Error opening the file.
Kart içerisinde anlamsız karakterler içeren dizinler ve dosyalar.

Bunun dışında kart üzerine yazarken ve okurken kartı çıkarmak istemiyorum. Buna yönelik Arduino sayfasında ve kodun yönergesinde bir şey yok. Bir ihtimal kart çalışırken çıkardığım için olabilir gibi bir olasılık üzerinde durdum. Ama bu olasılık yaygın olsa her forumda bahsedilirdi.

Acaba Arduino'dan kartı nasıl çıkarmak gerekir?
A.Arduino'yu fişten çek, kartı çıkar
B.Kartı doğrudan çıkar
C. Reset'e bas kartı çıkar
D. Serial'den bir karakter gönderip kodu boş kısır döngüye sokarak
E. Ekstra bir buton ekleyip kısır döngüye sokarak

Yeni kart okuyucum gelinceye kadar biraz daha okuyup tekrar denerim.